顺序容器(上)

#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中所有的元素


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值