顺序容器的类型:
顺序容器:
vector
list
deque
顺序容器适配器
stack
queue
priority_queue
9.1 顺序容器的定义
1) 头文件
#include<vector>
#include<list>
#include<deque>
2) 初始化
例如:
vector<int> a1; // 这个时候其实不进行int的初始化操作,
vector<int > a2(a1);
vector<int> a3(a1.begin(),a1.end());
vector<int> a4(n,10);//n个10
vector<int> a5(n);//size()==n
3) 引用类型没有进入容器的权利~
4) 做容器的容器的时候注意书写
vector< vector<string> > b;//”>>”空格是不能少的!
9.2 迭代器的范围
1) 对于vector
和deque来说,迭代器可以进行加减运算,大小比较,因为他们是线性的…..
2) 对于end()
总是指向了一个空迭代器
3) 删除元素可以用eraser()
9.3 顺序容器的操作
1) 容器定义的类型别名
size_type 储存容器类型的长度
iterator 迭代器
const_iterator 只读的迭代器
reverse_iterator 逆序迭代器
const_reverse_iterator 逆序只读迭代器
difference_type 足够存储两个迭代器差值的有符号整形
value_type 元素类型
reference
元素的左值等效于value_type&
const_reference 元素的常量左值等效于 const value_type&
2) begin,end//顺序的
rbegin,rend//
这4个函数都有两种,一种返回的是非const迭代器,一种返回const迭代器,根据容器的类型决定
3) 添加元素
c.push_back(t);
c.push_front(t);//只适用于list
和deque
c.insert(p,t);//p指向的元素前面插入
c.insert(p,n,t);//p指向的元素前面插入n个t
c.insert(p,b,e);//p指向的元素前面插入b->e的元素
这些函数只是保存了副本,对原来的变量没有影响
例子:
list<string> lst
list<sring> :: iterator iter =lst.begin();
while(cin>>word)
iter= lst.insert(iter,word);//等效于push_front();
任何添加操作都可能使得迭代器失效,不要存储end()返回的迭代器~
4) 关系操作符
容器的比较,用到的是容器存储的元素的比较.
5) 容器大小的操作
c.size();
c.max_size();//返回最多可以容纳的个数
c.empty();//判断是否为空
c.resize(n);//将大小限制为n
多了就减少 少了就增加
c.resize(n,t);// 增加的元素都为t
resize操作同样可以使迭代器无效~
6) 访问元素
front 或者 back
返回的是引用
c.back();
c.front();
c[n]//只适用于vector
和deque
c.at(n);//只使用与vector
和 deque 如果越界将抛出out_of_range异常
7) 删除元素
c.erase(p);//返回删除元素的下一个元素
c.erase(b,e);//同上
c.clear();//删除所有
c.pop_back();//删除容器最后一个元素
c.pop_front();//删除容器第一个元素,只适用于list
或者 deque 容器
例子:删除指定值的一个元素
string searchValue(“Quasimodo”);
list<string> :: iterator iter=find(slist.begin(),slist.end(),searchValue);
if(iter!=slist.end())
slist.erase(iter);
8) 赋值与swap
c1=c2;
c1.swap(c2);//没有删除插入的操作,在常量时间内进行
c.assign(b,e);//
c.assign(n,t);