这次深入学了一下C++中的容器,容器分为顺序容器和关联容器。
顺序容器:将单一类型的元素聚集起来成为容器,然后根据位置来存储和访问元素。顺序容器的元素排列次序与元素指无关,而是有元素添加到容器里的次序决定的。顺序容器包括vector(支持快速随机访问),list(支持快速插入/删除),deque(双端队列),顺序容器适配器包括stack,queue,priority_queue。
关联容器:通过键(key)存储和读取元素。两个基本的关联容器是map和set,multimap和multiset不做介绍。
容器的选择:除非找到选择使用其他容器的更好理由,否则vector容器都是最佳选择。
下面介绍容器的各种操作:
1、容器元素初始化:
vector<int> v1;//名为v1的空容器
vector<int> v2(v1);//名为v2,初始化为v1的容器
vector<string> svec;
//传递迭代器时可以不要求两个容器类型一致,只要元素相互兼容就好。
list<string> slist(svec.begin(),svec.end());//传递两个迭代器初始化slist
deque<string> sdeque(svec.begin(),svec.end());//传递两个迭代器初始化sdeque
list<int>::size_type list_size=64;
list<string> slist(list_size,"eh");//slist中有64个字符串,每个字符串都是eh。第二个参数可以没有,即可以只指定容器的大小。这个方法只适合于顺序容器。
2、容器内元素的类型约定:
元素类型必须支持赋值运算,元素类型的对象必须可以复制。
IO库类型不支持复制和赋值,因此,不能创建存放IO类型对象的容器。
3、在容器中添加元素:
顺序容器:
container.push_back(tmp);//container可以是vector,list,deque
container.push_front(tmp);//container可以是list和deque
container.insert(iter,tmp);//container可以是vector,list,deque。insert函数是在其指向位置之前插入元素而不是后面。这句话可以理解成在container的迭代器iter之前插入tmp。并且后面的元素逐个后移一位。返回指向新添加元素的迭代器
container.insert(iter,n,tmp);//container的迭代器iter之前插入n个tmp。返回void类型
container.insert(p,b,e);//在迭代器p所指向的元素前面插入有迭代器b和e标记的范围内的元素。返回void类型
4、在容器中删除元素:
c.erase(p);//删除迭代器p所指向的值,返回一个迭代器,它指向被删除元素后面的元素。
c.erase(b,e);//删除迭代器b和e之间的元素,包括b指向的元素不包括e指向的元素,即前闭后开。
c.clear();//清空c
c.pop_back();//删除c的最后一个元素
c.pop_front();//删除c的第一个元素,只适用于list或deque
5.、获取容器的第一个和最后一个元素:
c.back();//获取最后一个元素的引用
c.front();//获取第一个元素的引用
6、获取容器大小:
c.size();//返回容器c中的元素个数。
c.max_size();//返回容器c可容纳的最多元素个数,这个数往往很大。
c.empty();//c是否为空
c.resize(n);//调整容器c的长度大小,使其能容纳n个元素。如果n<c.size(),则删除多出来的元素,否则,添加采用值初始化的新元素。
c.resize(n,t);//调整容器c的大小,使其能容纳n个元素,所有新添加的元素值都为t。
c.capacity();//获取在容器需要分配更多的存储空间之前能够存储的元素总数,返回值为这个总数。c为vector
c.reserve();//告诉容器应该预留多少个元素的存储空间,相当于改变capacity的值。c为vector
下面介绍与关联容器相关的一个标准库类型——pair类型
pair<T1,T2> p1 创建一个空pair对象,两个元素分别为T1和T2类型,采用值初始化。
pari<T1,T2> p2(v1,v2); 创建一个pair对象,它的两个元素分别是T1和T2类型,其中first初始化为v1,second初始化为v2
make_pair(v1,v2); 以v1和v2值创建一个新的pair对象,返回值为这个pair
p.first 返回p中名为first的共有数据成员
p.second 返回p中名为second的共有数据成员
下面介绍map类型
map定义的类型:
map<k,v>::key_type 在map容器中,用作索引的键的类型
map<k,v>::mapped_type 在map容器中,键所关联的值的类型
map<k,v>::value_type 一个pair类型,它的first元素具有const map<k,v>::key_type类型,而second元素则为map<k,v>::mapped_type类型
所以value_type是pair类型,它的值成员可以修改,但键成员不能修改。
下面介绍set类型
set包含0个或者多个不重复不排序的元素。