第九章 顺序容器

char *words[]={"abbc","plump","buck","mulligan"}
这里其实是定义了一个指针数组.
 
顺序容器的元素排列次序与元素值无关,而是由元素添加到容器中的次序决定的.
 
顺序容器:vector<支持快速随机访问>   list<支持快速插入、删除>  deque<双端队列>
 
顺序容器适配器  stack 后进先出LIFO栈   queue 先进先出FIFO队列.  priority_queue有优先级管理的队列.
 
将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同.
 
接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化
也就是说  list<int> ilist(10);或者   vector<string> good(5,"hao");
 
容器内元素的类型必须满足以下两个约束:
1.元素类型必须支持赋值运算
2.元素类型的对象必须可以复制.
 
由于引用不支持一般意义的赋值运算,因此没有元素是引用类型的容器
IO库类型不支持复制或者赋值。因此不能创建存放IO类型对象的容器.
 
1.容器操作的r特殊要求::一些容器操作对元素类型还有特殊要求。如果元素类型不支持这些特殊要求,则相关的容器操作就不能执行:我们可以定义该类型的容器,但不能使用某些特定操作。
 
如:容器存储类类型的对象,那么只有当其元素类型提供默认构造函数时,容器才能使用这种构造函数。尽管有一些类没有提供默认构造函数,但是大多数类类型都会有。假如类Foo没有默认构造函数,单提供了需要一个int型形参的构造函数。现在,考虑:
vector<Foo> empty;//可以.不需要默认构造函数.
vector<Foo> bad(10)//错误,没有默认构造函数
vector<Foo> ok(10,1)//可以.每个元素初始化为1
 
vector和deque容器的迭代器提供额外的运算.
iter+n(iter -n):在迭代器上加减整数值n,将产生指向容器中前面(后面)第n个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一位置.
 
关系操作符只适用于vector和deque容器,这是因为只有这两种容器为其元素提供快速、随机的访问。它们确保可根据元素位置直接有效地访问指定的容器元素。这两种容器都支持通过元素位置实现的随机访问,因此它们的迭代器可以有效地实现算数和关系运算。
 
迭代器范围:这两个迭代器分别指向同一个容器中的两个元素或超出末端的下一位置。一般注意第二个迭代器是指向最后一个元素的下一个位置。【first,last)  左闭合区间:这样定义可以很明显的理解到,1,当first与last相等时,迭代器范围为空;2.当first与last不相等时,迭代器范围内至少有一个元素,而且first指向该区间中的第一个元素。此外,通过若干次自增运算可以使first的值不断增大,直到first==last未知。
 
这就提供了一种做法
while(first!=last)
{
++first;
}
 
对形成迭代器范围的迭代器的要求:
1.它们指向同一个容器中的元素或者超出末端的下一个位置。
2.如果这两个迭代器不等,则对first反复做自增运算必须能够到达last。换句话说,在容器中,last绝对不能位于first之前。
 
注意会使迭代器失效的一些操作,使用迭代器编写程序时,必须留意哪些操作会使迭代器失效。使用无效迭代器将会导致严重的运行时错误.
 
list<string>::iterator  iter;//解释:将iter声明为iterator类型, 而iterator是存放在string类型元素的list类成员.
 
在顺序容器中添加元素.
所有顺序容器都支持push_back操作,提供在容器尾部插入的一个元素的功能。
c.push_back(t)  在容器c的尾部添加t的元素
c.push_front(t)  在容器c的前端添加t的元素
c.insert(p,t)在迭代器p所指向的元素前面插入值为t的新元素.返回指向新添加元素的迭代器。
c.insert(p,n,t)在迭代器p所指向的元素前面插入n个值为t的新元素。
c.insert(p,b,e)在迭代器p所指向的元素前面插入由迭代器b和e标记的范围内的元素。
 
 
容器元素都是副本.
 
容器大小的操作:
c.size()  返回容器c中的元素的个数.返回类型为c::size_type;
c.max_size() 返回容器c可容纳的最多元素个数,返回类型为c::size_type;
c.empty() 返回标记容器大小是否为0的布尔值.
c.resize(n) 调整容器c的大小,使其能容纳n个元素.如果n<size(),则删除多出来的元素;否则,添加采用初始值化的新元素.
c.resize(n,t) 调整容器c的大小,使其能容纳n个元素。则所有新添加的元素值都是t.
 
 
删除元素
c.erase(p)  删除迭代器p所指向的元素,翻一个迭代器,它指向被删除元素的后面元素。如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一个位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数未定义.
 
c.erase(b,e) 删除迭代器b和e所标记的范围内的所有元素,返回一个迭代器,它指向被删除元素段后的元素。
 
c.clear(0 删除容器c内的所有元素。
 
c.popback() 删除容器c内的最后一个元素。
c.pop_front() 删除容器c的第一个元素.//vector容器不支持此操作.
 
删除容器内所有元素:
a.clear();或者a.erase(a.begin(),a.end());
 
assign
assign操作首先删除容器中的所有元素,然后将其参数所指定的新元素插入到容器中。与复制容器元素的构造函数一样,如果两个容器类型相同,其元素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器.
 
如:slist1.assign(slist2.begin(),slist2.end()).
 
assign运算的第二个版本需要一个整型数值和一个元素值作为参数,它将容器重置为存储指定数量的元素,并且每个元素的值都是指定值:
slist1.assign(10,"Hiya");
原文地址:https://www.cnblogs.com/crazycodehzp/p/3295812.html