顺序容器(上)

来源:互联网 发布:java怎么制作游戏 编辑:程序博客网 时间:2024/06/05 08:50

#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循环中记得+2vec.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和listvec.erase(iter)   //删除迭代器p指向的元素,返回被删除元素的下一个元素的迭代器vec.erase(iter1,iter2)   //删除迭代器(b, e)范围内的元素,返回e的下一个元素的迭代器vec.clear()       //删除c中所有的元素


0 0
原创粉丝点击