我是靠谱客的博主 潇洒诺言,最近开发中收集的这篇文章主要介绍C++ STL常用容器删除操作注意事項,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C/C++程序员对STL 容器肯定不会陌生, 以下是对常用容器进行 erase 操作注意事项的总结:

vector

vector 容器是用数组实现的, 它在内存是连续分布的.对它进行 insert 或 erase 操作涉及到对插入点或删除点后的元素进行移位, 所以插入点或删除点后的iterator 会失效.

iterator erase( iterator pos );
iterator erase( const_iterator pos );

查看 STL 帮助得知vector::erase 函数的返回值是当前迭代器指针的下一个迭代器.

Iterator following the last removed element. If the iterator pos
refers to the last element, the end() iterator is returned.

所以对 vector 进行 erase 操作可以采用如下形式:

//删除 vector1中值等于 num 的元素
for(; it != vector1.end(); ) {
if(num == *it)
it = vector1.erase(it);
else
++it;
}

list

STL 的list容器是采用双向链表实现的, 使用不连续的内存空间存储元素.inser时不会导致任何迭代器失效, erase 时删除点的迭代器失效, 但是不影响其他迭代器. 它的 erase 函数类似 vector, 该函数返回值是当前迭代器指针的下一个迭代器.但是由于底层实现不同, list 的删除操作可以采用更加灵活地方式.

//删除 list1中值等于 num 的元素
for(; it != list1.end(); ) {
if(num == *it)
it = list1.erase(it);
//list1.erase(it++); //also OK
else
++it;
}

map

STL的 map 容器底层采用红黑树实现, 也就是说是一种平衡二叉树, 它的插入和删除效果和 list 类似.inser时不会导致任何迭代器失效, erase 时只有删除点的迭代器失效, 其他迭代器不受影响. 代码写法也与 list 类似:

 // 删除 map1中所有 key 为奇数的元素
for(auto it = map1.begin(); it != map1.end(); ) {
if(it->first % 2 == 1)
//it = map1.erase(it);
map1.erase(it++);
else
++it;
}

其他容器如 dequeue的操作方法借鉴vector, set 可以借鉴 map 这里就不再赘述.一下是测试代码:

//To complie: g++ -o test test.cpp -std=c++11
#include <iostream>
#include <algorithm>
#include <string>
#include <list>
#include <vector>
#include <map>
using std::cout;
void test1()
{
std::vector<int> vi{1,2,3,3,3,5};
int num = 3;
std::vector<int>::iterator it = vi.begin();
//erase element whose value is 3
for(; it != vi.end(); ) {
if(num == *it)
it = vi.erase(it);
else
++it;
}
std::copy(vi.begin(), vi.end(), std::ostream_iterator<int>(cout, "t"));
cout << 'n';
}
void test2()
{
std::list<int> li{1,2,3,3,3,5};
int num = 3;
std::list<int>::iterator it = li.begin();
//erase element whose value is 3
for(; it != li.end(); ) {
if(num == *it)
//it = li.erase(it);
li.erase(it++);
else
++it;
}
std::copy(li.begin(), li.end(), std::ostream_iterator<int>(cout, "t"));
cout << 'n';
}
void test3()
{
std::map<int, std::string> map1 = {{1, "one"}, {2, "two"}, {3, "three"},
{4, "four"}, {5, "five"}, {6, "six"}};
// erase all odd numbers from map1
for(auto it = map1.begin(); it != map1.end(); ) {
if(it->first % 2 == 1)
//it = map1.erase(it);
map1.erase(it++);
else
++it;
}
for(auto& p : map1) {
cout << p.second << ' ';
}
cout << 'n';
}
int main() {
// test1();
// test2();
test3();
return 0;
}

最后

以上就是潇洒诺言为你收集整理的C++ STL常用容器删除操作注意事項的全部内容,希望文章能够帮你解决C++ STL常用容器删除操作注意事項所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部