1、几种容器的比较:
(1)vector:内部数据结构:数组
在末尾增加或者删除元素所需时间与元素数目无关,在中间或者开头增加或者删除所需时间呈线性变化。
(2)deque:内部数据结构是:数组
随机访问每个元素,所需要的时间为常量。在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除所需时间随元素数目呈线性变化。
(3)list:内部数据结构:双向环状链表
不能随机访问一个元素,可双向遍历,在开头,末尾和中间的任何地方增加或者删除元素所需时间都是常量。
(4)set:键和值相等。
键唯一,元素按照默认升序排列
(5)map:键唯一
元素按照默认升序排列
2、关于迭代器失效的问题,小心使用stl中的erase。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> #include <vector> using namespace std; int main(){ vector< int > vect; for ( int i=0;i<10;i++){ vect.push_back(i); } vector< int >::iterator iter = vect.begin(); for (iter;iter!=vect.end();iter++){ if (*iter%2==0){ vect.erase(iter); } } return 0; } |
程序直接就crash了。iter是指向vector这个容器中的某个元素,如果不是在for,while循环中,erase删除元素是没有问题的,但是如果在forwhile循环中对容器进行迭代,删除其中符合条件的所有元素,就可能出现问题。vect.erase(iter)及其后面的迭代器已经失效了,不应该在使用这些迭代器了,在执行it+,其行为是未定义的。其他容器也会遇到迭代器失效的问题。对于vector被删除元素的迭代器机制向后面元素的迭代器全部失效。对于deque在手部或尾部删除元素这只会是指向被删除元素的迭代器失效,任何其它位置的插入和删除操作将是指向该容器元素的所有迭代器失效。
对于list仅有指向被删除元素的迭代器失效。为什么不同容器迭代器失效情况差别?主要与各容器的数据结构相关。
那么我们看看个容器删除元素的通用做法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> #include <iostream> #include <vector> #include <map> #include <deque> #include <list> using namespace std; int main() { vector< int > vect; for ( int i=0;i<10;i++){ vect.push_back(i); } vector< int >::iterator iter = vect.begin(); for (;iter!=vect.end();){ if (*iter%2==0){ iter = vect.erase(iter); } else { iter++; } } for (vector< int >::iterator iter = vect.begin();iter!=vect.end();iter++){ cout<<*iter<< " " ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> #include <iostream> #include <vector> #include <map> #include <deque> #include <list> using namespace std; int main() { deque< int > mydeque; for ( int i =0;i<10;i++){ mydeque.push_back(i); } deque< int >::iterator iter = mydeque.begin(); for (;iter!=mydeque.end();){ if (*iter%2==0){ iter = mydeque.erase(iter); } else { iter++; } } for (deque< int >::iterator iter = mydeque.begin();iter<mydeque.end();iter++){ cout<<*iter<< " " ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> #include <iostream> #include <vector> #include <map> #include <deque> #include <list> using namespace std; int main(){ map< int , int > mymap; mymap[0] = 1; mymap[1] = 2; mymap[2] = 3; mymap[3] = 4; map< int , int >::iterator it = mymap.begin(); for (; it != mymap.end();){ if ((it->second % 2) == 0){ //mymap.erase(it++); it = mymap.erase(it); } else { it++; } } for (auto iter = mymap.begin(); iter != mymap.end(); ++iter){ cout << iter->first << " " << iter->second << endl; } system( "pause" ); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Huawei LiteOS基于Cortex-M4 GD32F4平台移植
· mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处