#include <array> //c++11 数组类型
#include <list> //双向链表,插入删除速度快,不支持随机访问
#include <forward_list> //c++11 单向链表,单向访问,插入删除速度快,不支持随机访问,没有size操作
#include <deque> //双端队列,支持快速随机访问
#include <string> //插入删除耗时
#include <vector> //插入删除耗时
初始化(除array皆可用)
vector<int> vec; //默认初始化
vector<int> vec(10);//10个都是0的元素
vector<int> vec1(10, 1);//10个都是1的元素
vector<int> vec{ 1,2,3,4,5 };
注意花括号和括号的区别
vector<string> vec{ 10 };//10个元素
vector<string> vec{ 10,"hi" };//10个都是"hi"的元素
ivec的元素类型要能够隐式转换为vec的元素类型
vector<int> vec(ivec); //复制
vector<int> vec(ivec.begin(), ivec.end());//复制指定范围
迭代器
1.迭代器之间的加减,自加自减运算
2.大小比较(只限vector和string)
#include <iterator>
string::iterator//读写
string::const_iterator//只读
vector<int>::iterator//读写
vector<int>::const_iterator//只读
auto it = s1.begin();auto it = s1.end();
string::const_iterator//只读
auto it = s1.cbegin();auto it = s1.cend();
函数
for (auto ix = ivec.begin(); ix != ivec.end(); ++ix)
//此处不该为int 用!=,而不用<=
*ix = 0; //将各个元素赋值为0
while (iter != vi.end()) {}//每次循环后需要重新确定尾后迭代器的位置
vector<int>::iterator find1(vector<int>::iterator a, vector<int>::iterator b, int c)//可以用decltype(s1.begin())
{
for (a; a != b; a++)
{
if (*a == c)//迭代器需进行解引用操作
return a;
}
return b;//未找到的情况,返回最后一个迭代器
}
操作
vec1 = vec2;//用等号复制类型必须相同
/*拷贝容器来进行新建的容器类型必须相同*/
vector<const char*>s1 = { "asad" };
vector<string>s2(s1);//无法转换
/*拷贝容器范围来进行新建的容器类型只要可以相互转换*/
vector<string>s2(s1.begin(), s1.end());
swap(vec, vec1);//不用加点的版本
/*
交换后vec1有5个元素,vec1有10个元素
原来指向vec的指针会指向ivec
交换的是整个容器内容
可以认为交换的是容器的名字
对string使用会使迭代器失效
对于array使用交换的是元素内容,引用和迭代器不会失效
*/
ivec3.assign(ivec4.begin(), ivec4.end());
ivec3.assign(10, 11);//10个11
ivec3.assign({ 2,2,2,2,2,2 });
/*
除array之外
swap的类型要求相同
assign只要求相容(例如char*转化为string)
先定义后使用
*/
vec.empty();
/*forward_list无法使用*/
vec.size();/*返回为unsigned型,string::size_type*/
/*
array和forward_list无法使用
使用以下插入函数只有list的引用和迭代器不会失效
vector,string,deque需要更新迭代器
插入的是对象的拷贝,而不是对象本身
*/
/*返回void*/
//在while循环中记得+2
vec.push_back();
vec.push_front();//vector和string不支持
vec.emplace_back();
vec.emplace_back(171,"meiyouren");//根据内容调用相应的构造函数
il.emplace_front(171, "meiyouren");//除vector和string
iter = il.insert(iter, p1);/*在iter之前插入1个元素,返回指向新元素的迭代器*/
/*
指向原来的下一个元素要+2
vector(除了末尾),string,deque使用插入的速度很耗时
*/
vec2.insert(iter2, 3, 10);//迭代器位置之前插入n个t元素
ivec3.insert(iter3, ivec2.begin(), ivec2.end());//迭代器位置之前插入另一个类型相同容器迭代器范围内的元素
ivec4.insert(ivec.begin(), {1,1,1});
访问
//返回引用
int a = vec1.front();
int b = vec1[0];/*返回为unsigned型,string::size_type
forward_list和list不能用下标运算*/
int c = vec1.at(0);
删除
/*
不适用于array
删除deque中除首尾位置之外的任何元素都会使所有迭代器,引用指针失效
如有需要请先保存
*/
vec.pop_back(); /*删除尾元素,返回void除forward_list*/
vec.pop_front(); //除vector和list
vec.erase(iter) //删除迭代器p指向的元素,返回被删除元素的下一个元素的迭代器
vec.erase(iter1,iter2) //删除迭代器(b, e)范围内的元素,返回e的下一个元素的迭代器
vec.clear() //删除c中所有的元素