之前有学习过 vector、set、map等容器,都是需要什么搜什么,没有详细的了解其中的内容。最近在看 STL 的相关内容,就顺手整理一些基础性内容,避免以后遇到的时候再临时抱佛脚。
vector<T> v; //创建一个空的vector vector<T> v(int nSize, const t& t); //创建一个vector,元素个数为nSize,元素值均为t vector<T> v(int nSize); //创建一个vector,元素个数为nSize vector<T> v(const vector&); //复制构造函数 vector<T> v = vector(begin,end); //复制[begin,end]范围内另一个数组的元素到 v中
v.push_back(const T& x); //在vector尾部增加一个元素x v.insert(iterator it, const T& x); //在vector中迭代器指向的元素前插入一个元素x v.insert(iterator it, int n,const T& x); //在vector中迭代器指向的元素前插入n个相同的元素x v.insert(iterator it,const_iterator first,const_iterator last); //在vector中迭代器指向的元素前插入另一个相同类型vector中[first,last]间的元素
v.erase(iterator it); //删除vector中迭代器指向的元素 v.erase(iterator first, iterator last); //删除vector中[first,last)的元素 v.pop_back(); //删除vector中的最后一个元素 v.clear(); //清空向量中的所有元素
v.at(int nPos); //返回nPos位置元素 v.front(); //返回vector的首元素 v.back(); //返回vector的尾元素 v.begin(); //返回指向第一个元素的迭代器 v.end(); //返回指向最后一个元素下一位置的迭代器 v.rbegin(); //反向迭代器,指向最后一个元素 v.rend(); //反向迭代器,指向第一个元素的前一个位置
v.empty(); //判断vector是否为空
v.size(); //返回vector中元素个数 v.capacity(); //返回当前vector中所能容纳的最大元素个数 v.max_size(); //返回当前vector最大可允许的元素数量个数
v.swap(vector& v2); //交换两个同类型的vector v.assign(int n,const T& t); //设置vector中第n个元素的值为t v.assign(const_iterator first,const_iterator last); //vector中[first,last)中的元素设置成当前vector元素
deque(double ended queue) 作为双端队列,不论在尾部或头部插入元素,都十分便捷。而在中间插入元素会比较费时,因为必须移动中间其他的元素。
双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,它可以在需要的时候改变自身大小,完成了标准 C++ 数据结构中队列的所有功能。
虽然 deque 也提供 Random Access Iterator,但它的迭代器并不是普通的指针,复杂度较高。因此除非必要,应尽可能选择使用 vector 而非 deque。对 deque 的排序操作,可以先完整复制到一个 vector 中,使用 STL 中的排序操作对 vector 排序后,再复制回 deque。
deque 通常由一些独立的区块组成,第一个区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问,但不像 vector 一样把所有对象保存在一个连续的内存块,而是多个连续的内存块,并且在一个映射结构中保存对这些块以及顺序的跟踪。
#include<deque> deque<type> deq; //声明一个元素类型为 type 的双端队列 deq deque<type> deq(nSize); //声明含有 nSize 个默认初始化元素的 deq deque<type> deq(nSize, value) //声明含有 nSize 个值为 value 的元素的deq deque<type> deq(MyDeque); //复制MyDeque到deq deque<type> deq(first, last); //使用迭代器first,last范围内的元素初始化deq
deq[nPos]; //访问双向序列中 nPos 位置上的元素 deq.front(); //返回第一个元素 deq.back(); //返回最后一个元素 deq.push_front(x); //把元素 x 插入到 deq 的头部 deq.pop_front(); //弹出 deq 的第一个元素 deq.push_back(x); //把元素 x 插入到 deq 的尾部 deq.pop_back(); //弹出 deq 的最后一个元素
最近在学习 C++ 中 STL 标准库中的东西,关于list、vector、deque、set、map等容器的操作函数中存在一些通用函数,整理出来一起学习。
ContType<T> C; //创建一个空容器 ContType<T> C(nSIze); //创建一个含有 nSize 个默认元素的容器 ContType<T> C(nSize, Value); //创建一个含有 nSize 个值为 Value 的元素的容器 ContType<T> C1(C2); //复制一个同类型容器 ContType<T> C(first, last); //复制[first,last)范围内的元素到新容器中 C.~ContType(); //删除所有元素,释放内存
C.empty(); //判断容器是否为空 C1==C2; //判断c1是否等于c2
lst.get_allocator(); //返回容器的内存模型 C.begin(); //正向迭代器,指向第一个元素 C.end(); //正向迭代器,指向最后一个元素的下一位置 C.rbegin(); //反向迭代器,指向最后一个元素 C.rend(); //反向迭代器,指向第一个元素的前一个位置 C.size(); //返回容器当前存储的元素数量 C.max_size(); //返回容器能容纳的最大元素数量
C1=C2;//将c2的值赋给c1 //swap()交换函数 C1.swap(C2);//交换c1和c2的数据 Swap(C1,C2);//同上 //assign()赋值函数 C.assign(size_type nSize, const_type Value); //将list中元素替换为 nSize 个值为 Value 的元素 C.assign(iterator first,iterator last); //将[first,last)中的元素复制到当前容器中 C.assign(ContType<T> &C2); //将另一个容器中的元素复制到当前容器中
C.clear();//清空容器 //insert()插入元素 C.insert(iterator iter, const_type Value);//在 iter 指向的位置插入值为 Value的元素 C.insert(iterator iter,size_type num, const_type &Value);//在 iter 指向的位置插入 num 个值为 Value的元素 C.insert(iterator iter,iterator fisrt,last);//在 iter 指向的位置插入[first,end)区间内的所有元素 //erase()删除元素 C.erase(nPos,nSize);//删除从下标 nPos 开始的 nSize 个元素 C.erase(iterstor iter);//删除该迭代器指向的元素 C.erase(iterator first,iterator lase);//删除[first,last)区间的元素 //vector、deque、list C.front(); //返回第一个元素 C.back(); //返回最后一个元素 C.resize(); //改变list的大小 //deque、list C.pop_front(); //删除第一个元素 C.push_front(Value); //在容器头部添加一个元素Value //vector、deque、list C.front(); //返回第一个元素 C.back(); //返回最后一个元素 C.resize(); //改变list的大小 C.pop_back(); //删除最后一个元素 C.push_back(Value); //在容器末尾添加一个元素Value //vector、list C.reverse(); //把list中的元素反转