说明:
1.list由双向链表实现的,不支持[]和at()函数,有较快的插入和删除函数,同时提供了sort,remove,remove_if ,reverse,merge,splice,unique等独有的函数
2.deque也是动态数组实现的,和vector相比可以push_front,push_back,pop_front,pop_back;deque和list都没有capacity()和reserve函数,不支持内存重分配机制;deque插入删除元素很慢;
| vector | list | deque |
头文件 | <vector> | <list> | <deque> |
定义及初始化 | vector<string> myvt; myvt.push_back(“123”) | list<int>list1; list<int>list1(10); list<int>list1(10,1); list<int>list2(list1); list<int>list3(list2.begin(),list.end());
list<int>list4.assign(list3.begin(),list3.end()) 重置元素 | deque<int> dq; deque<int>dq(10); deque<int>(10,3); deque<int>dq(dq1) deque<int>dq(dq1.begin(),dq1.end())
dq.assign(dq2.begin(),dq2.end()); dq.assign(5,4); |
容量 | 1)myvt.size(); 实际元素的多少 2)myvt.capacity(); 实际能容那的最多元素,测试好像与size相同 3)myvt.max_size(); 最大元素个数 4)myvt.resize(); 修改容器大小,同时改变size()和capacity()的大小 5)myvt.reserve(); 预设容器容量 改变的capacity()大小 | list1.size();实际元素多少 list1.max_size();最大允许容量
list1.resize();调整容量大小 | dq.size() deque.resize(n,x) 调整为n,元素为x (只有vector和deque可以这样调整) dq.max_size()最大容量 |
是否为空 | myvt.empty() myvt.clear() 清空 | List1.empty() List1.clear() | dq.empty()
|
遍历 | cout<<myvt.at(i); 迭代器遍历 Cout<<*it; 算法:for_each void out(int a) { cout << a; } for_each(myvt.begin(),myvt.end(),out) | 同理 | 提供[]和at() 允许 dq[i]=10; |
元素访问 | 1) myvt.at(i) 2) myvt[i] 3) myvt.front() 第一个元素 4) myvt.back()最后一个元素 | 没有at 和[] 访问数据的功能 List1.front(); List1.back(); | 1)提供[]和at() 允许dq[i]=10; 2)dq.front(); 3)dq.back();
|
迭代器 | 1) begin() 第一个元素 2) end()最后一个元素的下一个位置 3) rbegin()逆向第一个元素 4) rend()逆向最后一个元素的下一个位置 |
|
|
查找 | vector没有find函数 vector<int>::iterator it; it=find(myvt.begin(), myvt.end(), 3); cout << *it; 返回迭代器 参数: 1) 开始 2) 结束 3) 查找目标 | 没有find函数 | 没有find函数 |
排序 | bool compare(int &m, int &n) { return m>n;//从大到小 } sort(myvt.begin(),myvt.end(),compare) compare函数定义排序的方向 | list.sort() 从小到大排序 |
|
插入 | 1) insert 任位置插入 myvt.insert(myvt.begin(),-1) 2)myvt.push_back() 尾部插入 | 1)list1.push_front() 2) list.push_back(); 3)list.insertlist.begin(),5) List.insert(list.ebgin(),5(个数),5) list.insert(list.begin(),list2.begin(),list2.end()); | 1) dq.push_front(); 2) dq.push_back(); 3) dq.insert(dq,begin(),3); dq.insert(dq.begin(),3(个数),3); dq.insert(dq.begin(),dq2.begin(),dq2.end()); |
移除 | 1) myvt.pop_back()尾部删除 2) myvt.clear() 清除元素 3) myvt.erase(myvt.begin())删除开始元素,也可以删除一定范围的元素 remove算法 | 1) list.pop_front() 2) list.pop_back(); 3)list.erase(it) 4)list.clear() 清除元素 5)list.remove(9) 6)list.remove_if() bool isodd(int a) { return a % 2 == 1; } l1.remove_if(isodd); isodd函数为真则移除
| 1) dq.pop_front(); 2) dq.pop_back(); 3) dq.erase(dq.begin()); 4) dq.clear() |
交换 | myvt.swap()函数实现瞬间交换 | list3.swap(list1)交换的同时,列表的大小也交换了 | dq.swap(dq2) |
运算符函数 | 支持==,>=,<=,!=,>,<等判断比较符号 | 支持==,>=,<=,!=,>,<等判断比较符号 | 支持==,>=,<=,!=,>,<等判断比较符号 |
合并函数 | 没有 | 1)合并前,两个序列是有序的,并且顺序相同 list1.merge(list2) 2) splice函数 list1.splice(list1.end(),list2);合并list1和list2 list1.splice(list1.end(),list2,list2.begin()) 把list2开始元素插入list1后边 List1.splice(list1.end(),list2,list2.begin(),list2.end()) 将list2种元素插入list1中 |
|
排除相同元素 | 没有 | list1.sort() list1.unique() 移除相邻的相同元素,一般是排序以后使用 | 没有 |
颠倒 | 没有 | list.reverse() 逆序链表 | 没有 |