选择合适的STL容器是关键,vector适合尾部操作但中间插入删除慢,list任意位置插入删除快但随机访问差,deque头尾操作高效,set和map插入删除复杂度为O(log n)且自动排序;若频繁在中间插入删除应选list或forward_list,仅尾部添加则用vector;vector的insert和erase非尾部操作需移动元素,复杂度O(n),可用erase-remove惯用法优化批量删除;list插入删除O(1),但查找位置开销大,且循环中erase需用返回值更新迭代器以防失效;map和set插入删除O(log n),推荐emplace避免临时对象开销;所有容器都需注意迭代器失效问题,尤其是vector、deque在操作后原有迭代器可能失效,应使用erase返回值或范围for循环降低风险。

C++ STL容器的insert和erase操作,用对了能提升效率,用错了可能埋下性能隐患。关键在于理解不同容器的特性以及操作背后的复杂度。
理解并高效使用C++ STL容器的insert和erase操作,核心在于选择合适的容器和操作方式,避免不必要的性能损失。
选择容器是第一步,直接影响后续insert和erase的效率。
vector
list
deque
set
map
例如,如果你需要频繁在中间插入删除元素,
std::list
std::forward_list
std::vector
立即学习“C++免费学习笔记(深入)”;
vector
vector
vector
vector
一个常见的优化技巧是,如果需要在
vector
erase-remove
x
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 2, 4, 2, 5};
v.erase(std::remove(v.begin(), v.end(), 2), v.end());
// v 现在是 {1, 3, 4, 5}
return 0;
}这个方法比循环遍历删除效率更高,因为它只需要移动一次元素。
list
list
list
此外,需要注意的是,
list
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
for (auto it = lst.begin(); it != lst.end(); ) {
if (*it % 2 == 0) {
it = lst.erase(it); // erase 返回下一个有效的迭代器
} else {
++it;
}
}
for (int i : lst)
std::cout << i << " ";
std::cout << std::endl;
return 0;
}注意
erase
it
map
set
map
set
map
set
list
另外,
map
set
emplace
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap;
myMap.emplace(1, "value1"); // 避免创建临时对象
return 0;
}emplace
迭代器失效是使用STL容器时常见的坑。在insert和erase操作之后,有些迭代器会失效,导致程序崩溃或产生未定义行为。一般来说,
vector
deque
list
map
set
为了避免迭代器失效,可以遵循以下原则:
总的来说,理解不同容器的特性,选择合适的容器,并注意迭代器失效问题,才能高效安全地使用C++ STL容器的insert和erase操作。
以上就是C++STL容器insert和erase操作技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号