C++ STL常用容器删除操作注意事項
来源:互联网 发布:微信一键转发软件代理 编辑:程序博客网 时间:2024/06/04 19:38
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常用容器删除操作注意事項
- STL容器删除操作
- STL容器删除操作总结
- STL容器删除操作总结
- STL 容器的常用操作
- STL中各种容器的删除操作
- STL中容器的删除操作
- STL中各种容器的删除操作
- STL容器的遍历删除操作erase
- C++STL容器的基本操作
- C++STL容器部分操作多线程不安全
- C++:STL容器中,string操作
- 【C++】STL常用容器总结之一:容器与迭代器
- 【C++】STL常用容器总结之二:顺序容器
- 【C++】STL常用容器总结之十一:容器小结
- STL容器删除
- STL容器删除小结
- [C++再学习系列] STL容器删除操作总结
- 文件系统使用总结
- C++常见内存错误汇总
- Controlling Object Visibility and Editability in Unity Using HideFlags
- vb.net 教程 3-2 窗体编程之窗体 4
- java-记录一个子串在整串中出现的次数
- C++ STL常用容器删除操作注意事項
- 穿衣的搭配--装饰模式
- 使用工厂方法模式实现各种不同分润规则
- 【BZOJ】1293 [SCOI2009]生日礼物 (这题有多种解法)
- gcc编译器的使用
- Js_面向对象_canvas_02
- C语言sscanf()函数:从字符串中读取指定格式的数据&&C语言strtok()函数:字符串分割
- [牛客]选择排序练习题
- iOS之AFN常用封装(三)