【重学《C++Primer第四版》】第九章第十章、容器(顺序容器和关联容器)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013637931/article/details/45314885

这次深入学了一下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个或者多个不重复不排序的元素

展开阅读全文

没有更多推荐了,返回首页