C++ 顺序容器总结
2014-02-12 15:10
218 查看
标准库定义了3中顺序容器:vector、list、deque
一、顺序容器的定义
#include <vector>
#include <list>
#include <deque>
vector<int> ivec;
list<int> ilist;
1、顺序容器的初始化
C<Type> c;-----创建一个空容器---------------------------------------------------------------------------适用于所有容器;
C c(c2);----------创建c2的副本,c2和c必须是相同的容器类型并且有相同类型的元素------------适用于所有容器;
C c(beg,end);---利用两个迭代器创建容器c--------------------------------------------------------------使用于所有容器;
C c(n,t);----------创建容器里面含有n个t,t必须是容器C的类型/可转换成C类型-------------------仅适用于顺序容器;
C c(n);------------创建有n个值初始化元素的容器c------------------------------------------------------仅适用于顺序容器;
2、容器内元素的特殊要求
元素类型必须支持赋值运算;
元素类型的的对象必须可以复制;
IO类型的对象不支持复制,所以不能存储在容器中。
3、容器的容器
vector< vector<string> > lines;
二、迭代器
1、仅vector和deque容器的迭代器支持的运算
iter+n
iter-n
iter+=iter2
iter-=iter2
iter1-iter2
>,>=,<,<=
2、迭代器的范围
[first,last) 左闭右开,表示从first开始到last结束,但是不包括last。last绝对不能位于first之前。
(1)当fisrt=last时容器为空;
(2)当first!=last时容器至少有一个元素;
三、顺序容器的操作
1、添加元素
push_back(t);//适用于所有顺序容器
push_front(t);//仅适用于list和deque
insert(p,t);//在迭代器p前面插入一个元素,返回新添加元素的迭代器
insert(p,n,t)//在迭代器p前面插入n个t元素,返回void
insert(p,b,e)//在迭代器p前面插入迭代器b和e之间的元素
注意:添加元素可能使容器的迭代器部分或者全部失效,所以避免存储end操作返回的迭代器。
2、容器大小的操作
C.size();//返回容器内元素的个数
C.max_size(0;//返回容器可容纳的最大元素个数
C.empty();
C.resize(n);//调整容器的长度,使其能容纳n个元素,如果n<C.size(),删除过多的,else 添加采用值初始化的新元素
C.resize(n,t);//调整容器的长度,使其能容纳n个元素,新添加的元素初始化为t
3、访问容器的元素
C.back();
C.front();
C
;//仅适用于vector和deque容器
C.at(n);//仅适用于vector和deque容器
4、删除容器中的元素
C.pop_back();返回void
C.pop_front();//仅适用于vector和deque容器,返回void
C.erase(p);//删除p所指的元素,返回下一个位置
C.erase(b,e);//删除迭代器b和e之间的元素,返回下一个位置
C.clear();//删除所有元素,返回void
5、赋值与swap
C1 = C2 等价于:C1.clear();C1.insert(C1.end(),C2.begin(),C2.end());
C1.swap(C2);//交换两个容器内的元素,容器类型和元素类型都必须相同,没有改变容器内元素的个数迭代器不会失效。但是原先指向C1的迭代器现在指向C2的元素,可以节省删除元素的成本。
C.assign(b,e);//删除原来的元素,将b和e之间的元素复制到C,删除原来的元素。可以不是同一容器类型的迭代器但是所指的元素类型必须相同或者相互兼容。
C.assign(n,t);//将容器重置为存储n个t元素
四、vector容器的自增长
为了支持随机访问,vector的元素以连续方式存放。当vector容器内存满元素后,再添加元素的话,需要重新分配几个更好的vector容器,然后在吧旧的容器内的元素复制到新的容器,再删除旧的容器,这样容器的性能会很差。
幸运的是标准库为vector容器实现了一个自增长策略。
实际分配的容器空间要比现在所需要的多一些。这样不至于每次添加元素的时候重新分配空间。当容器的capacity满之后,再重新分配2*capacity的容量。这样的自增长策略提高了vector的效率。
capacity——容器的容量;
size——容器内当前元素的个数;
这两个不同。
五、容器的选用
1、插入操作的影响
list容器表示不连续的内存区域,再任何位置都可以高效地插入(删除)一个元素
2、随机访问的影响
vector和deque都可以支持元素高效的随机访问。除非特殊需要,vector是最佳的选择
一、顺序容器的定义
#include <vector>
#include <list>
#include <deque>
vector<int> ivec;
list<int> ilist;
1、顺序容器的初始化
C<Type> c;-----创建一个空容器---------------------------------------------------------------------------适用于所有容器;
C c(c2);----------创建c2的副本,c2和c必须是相同的容器类型并且有相同类型的元素------------适用于所有容器;
C c(beg,end);---利用两个迭代器创建容器c--------------------------------------------------------------使用于所有容器;
C c(n,t);----------创建容器里面含有n个t,t必须是容器C的类型/可转换成C类型-------------------仅适用于顺序容器;
C c(n);------------创建有n个值初始化元素的容器c------------------------------------------------------仅适用于顺序容器;
2、容器内元素的特殊要求
元素类型必须支持赋值运算;
元素类型的的对象必须可以复制;
IO类型的对象不支持复制,所以不能存储在容器中。
3、容器的容器
vector< vector<string> > lines;
二、迭代器
1、仅vector和deque容器的迭代器支持的运算
iter+n
iter-n
iter+=iter2
iter-=iter2
iter1-iter2
>,>=,<,<=
2、迭代器的范围
[first,last) 左闭右开,表示从first开始到last结束,但是不包括last。last绝对不能位于first之前。
(1)当fisrt=last时容器为空;
(2)当first!=last时容器至少有一个元素;
三、顺序容器的操作
1、添加元素
push_back(t);//适用于所有顺序容器
push_front(t);//仅适用于list和deque
insert(p,t);//在迭代器p前面插入一个元素,返回新添加元素的迭代器
insert(p,n,t)//在迭代器p前面插入n个t元素,返回void
insert(p,b,e)//在迭代器p前面插入迭代器b和e之间的元素
注意:添加元素可能使容器的迭代器部分或者全部失效,所以避免存储end操作返回的迭代器。
2、容器大小的操作
C.size();//返回容器内元素的个数
C.max_size(0;//返回容器可容纳的最大元素个数
C.empty();
C.resize(n);//调整容器的长度,使其能容纳n个元素,如果n<C.size(),删除过多的,else 添加采用值初始化的新元素
C.resize(n,t);//调整容器的长度,使其能容纳n个元素,新添加的元素初始化为t
3、访问容器的元素
C.back();
C.front();
C
;//仅适用于vector和deque容器
C.at(n);//仅适用于vector和deque容器
4、删除容器中的元素
C.pop_back();返回void
C.pop_front();//仅适用于vector和deque容器,返回void
C.erase(p);//删除p所指的元素,返回下一个位置
C.erase(b,e);//删除迭代器b和e之间的元素,返回下一个位置
C.clear();//删除所有元素,返回void
5、赋值与swap
C1 = C2 等价于:C1.clear();C1.insert(C1.end(),C2.begin(),C2.end());
C1.swap(C2);//交换两个容器内的元素,容器类型和元素类型都必须相同,没有改变容器内元素的个数迭代器不会失效。但是原先指向C1的迭代器现在指向C2的元素,可以节省删除元素的成本。
C.assign(b,e);//删除原来的元素,将b和e之间的元素复制到C,删除原来的元素。可以不是同一容器类型的迭代器但是所指的元素类型必须相同或者相互兼容。
C.assign(n,t);//将容器重置为存储n个t元素
四、vector容器的自增长
为了支持随机访问,vector的元素以连续方式存放。当vector容器内存满元素后,再添加元素的话,需要重新分配几个更好的vector容器,然后在吧旧的容器内的元素复制到新的容器,再删除旧的容器,这样容器的性能会很差。
幸运的是标准库为vector容器实现了一个自增长策略。
实际分配的容器空间要比现在所需要的多一些。这样不至于每次添加元素的时候重新分配空间。当容器的capacity满之后,再重新分配2*capacity的容量。这样的自增长策略提高了vector的效率。
capacity——容器的容量;
size——容器内当前元素的个数;
这两个不同。
五、容器的选用
1、插入操作的影响
list容器表示不连续的内存区域,再任何位置都可以高效地插入(删除)一个元素
2、随机访问的影响
vector和deque都可以支持元素高效的随机访问。除非特殊需要,vector是最佳的选择
相关文章推荐
- C++ 顺序容器基础知识总结
- 【C++】STL常用容器总结之二:顺序容器
- 【C++】STL常用容器总结之六:基于deque的顺序容器适配器
- C++顺序容器基础知识总结
- [C++ 面试基础知识总结] 顺序容器
- C++ 顺序容器基础知识总结
- C++语法基础--顺序容器(二)--容器常用操作,迭代器失效总结
- C++顺序容器类总结
- C++学习笔记之容器:顺序容器
- C++顺序容器vector、deque、list
- C++ 容器及选用总结
- c++顺序容器的学习
- C++ 9.1 顺序容器-----vector、list、deque
- C++:顺序容器与迭代器
- C++ Primer 学习笔记——顺序容器的string操作
- C++学习笔记(六)----关于顺序容器
- c++中在顺序容器中访问、插入、删除元素的操作
- 对C++中顺序容器的适配器的认识
- C++STL容器使用经验总结
- [C++ 面试基础知识总结] 关联容器