c++,vector,map

本文深入探讨了STL容器中的Map与Vector在操作大量数据时的性能差异,揭示了Map每插入一个元素都需要进行排序的原因,从而导致其在插入速度上不如直接批量插入后再排序的方法。通过实例分析,帮助读者更全面地理解STL容器的底层机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用到了 vector,map,数据元素大概有30W,发现map的插入速度比vector慢很多。 突然才发现,stl容器,还是没有学透。

在csdn看到某位网友说:map每插入一个数据,都要排序一次。所以速度反不及先安插所有元素,再进行排序。

才知道原来如此。

仅以此记录。

### C++ 中 `std::vector` `std::map` 的用法与区别 #### 1. **`std::vector` 的用法** `std::vector` 是 C++ 标准模板库(STL)中的动态数组容器,允许在运行时动态调整大小。它提供了随机访问的能力,并且底层实现是一个连续的内存块[^1]。 以下是 `std::vector` 的基本用法: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 初始化一个包含 5 个整数的向量 vec.push_back(6); // 向向量末尾添加一个元素 vec.pop_back(); // 移除向量末尾的元素 for (const auto& num : vec) { // 使用范围 for 循环遍历向量 std::cout << num << " "; } std::cout << std::endl; std::vector<int>::iterator it = vec.begin(); // 获取指向第一个元素的迭代器 vec.insert(it + 2, 10); // 在第三个位置插入值为 10 的新元素 vec.erase(it + 3); // 删除第四个位置的元素 return 0; } ``` #### 2. **`std::map` 的用法** `std::map` 是一种关联容器,用于存储键值对(key-value pairs),并且按键排序。`std::map` 内部通常使用平衡二叉搜索树(如红黑树)实现,因此查找、插入删除操作的时间复杂度为 O(log n)[^2]。 以下是 `std::map` 的基本用法: ```cpp #include <iostream> #include <map> int main() { std::map<std::string, int> myMap; // 定义一个字符串作为键、整数作为值的 map myMap["apple"] = 1; // 插入键值对 myMap["banana"] = 2; std::cout << "Value of 'apple': " << myMap["apple"] << std::endl; // 访问键对应的值 if (myMap.find("orange") == myMap.end()) { // 检查键是否存在 std::cout << "'orange' is not in the map." << std::endl; } for (const auto& pair : myMap) { // 遍历 map std::cout << pair.first << ": " << pair.second << std::endl; } myMap.erase("banana"); // 删除键为 "banana" 的元素 return 0; } ``` #### 3. **`std::vector` `std::map` 的主要区别** | 特性 | `std::vector` | `std::map` | |-----------------------|-------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | 数据结构类型 | 动态数组 | 平衡二叉搜索树 | | 存储方式 | 连续内存块 | 非连续内存块 | | 查找时间复杂度 | O(n)(线性搜索) | O(log n)(基于键的二分查找) | | 插入/删除时间复杂度 | O(1)(在末尾插入),O(n)(中间或开头插入/删除) | O(log n)(任何位置插入/删除) | | 是否有序 | 不保证顺序 | 按键自动排序 | | 元素访问方式 | 通过索引访问 | 通过键访问 | | 内存开销 | 较低 | 较高(由于树结构的存在) | #### 4. **适用场景** - **`std::vector`**:当需要快速访问元素且数据不需要频繁插入或删除时,适合使用 `std::vector`。 - **`std::map`**:当需要根据键快速查找值,或者需要维护键值对的有序性时,适合使用 `std::map`[^2]。 --- ### 示例代码对比 #### 使用 `std::vector` ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; vec.push_back(6); for (const auto& num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` #### 使用 `std::map` ```cpp #include <iostream> #include <map> int main() { std::map<std::string, int> myMap; myMap["one"] = 1; myMap["two"] = 2; for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值