顺序容器的定义


一、顺序容器的定义

顺序容器


容器适配器


vector

支持快速随机访问

stack

后进先出(LIFO)

list

支持快速插入/删除

queue

先进先出(FIFO)

deque

双端队列

priority_queue

有优先级管理的队列


1、容器类型的操作集合形成了以下层次结构:

    1)一些操作适用于所有容器类型;

    2)另外一些操作只适用于顺序或关联容器;

    3)还有一些操作只适用于顺序或关联容器类型的一个子集。


2、容器构造函数

C<T>c;

创建一个名为c的空容器。C是容器类型名,vector,T是元素类型,intstring适用于所有容器

Cc(c2);

创建容器c2的副本c;cc2必须具有相同的容器类型,并存放相同类型的元素。适用于所有容器。

Cc(b,e);

创建c,其元素是迭代器be标示的范围内元素的副本。

适用于所有容器

Cc(n, t);

n个值为t的元素创建容器c,其中值t必须是容器类型C的元素类型的值,或者是可转换为该类型的值。

只适用于顺序容器

Cc(n);


创建有n个值初始化元素的容器c

只适用于顺序容器



3、将一个容器初始化为另一个容器的副本

    将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须完全相同。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. vector<int> ivec;  
  2. vector<int> ivec2(ivec);  //OK  
  3. vector<double> dvec(ivec);    //Error  
  4. list<int> ilist(ivec);        //Error  

4、初始化为一段元素的副本

    系统允许通过一对迭代器间接实现不同种容器之间进行复制:使用迭代器时,不要求容器类型相同,容器内元素类型也可以不相同,只要他们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. vector<string> svec;  
  2. //...  
  3. list<string> slist(svec.begin(),svec.end());  //OK  
  4.   
  5. vector<string>::iterator mid = svec.begin() + svec.size()/2;  
  6. deque<string> front(svec.begin(),mid);            //OK  
  7. deque<string> back(mid,svec.end());               //OK  
  8.   
  9. char *word[] = {"stately","plump","buck","mulligan"};  
  10. list<string> slist2(word,word + sizeof(word)/sizeof(*word));  //OK  
  11.   
  12. vector<int> ivec;  
  13. //...  
  14. vector<double> dvec(ivec.begin(),ivec.end()); //OK  

5、分配和初始化指定数目的元素

    不提供元素初始化式时,标准库将为该容器实现值初始化,采用这种类型的初始化,元素类型必须是内置或复合类型,或者是提供了默认构造函数的类类型。如果元素类型没有默认构造函数,则必须显式的指定其元素初始化式。

    接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. const list<int>::size_type list_size = 64;  
  2. list<int> ilist(list_size);       //OK  
  3. list<string> slist(list_size);    //OK  
  4.   
  5.        list<string> strList(list_size,"Ha~"); //OK  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //P267 习题9.2  
  2.     vector<string> strVec1;  
  3.     vector<string> strVec2(strVec1);  
  4.     vector<string> strVec3(strVec2.begin(),strVec2.end());  
  5.     vector<string> strVec4(strVec3.size());  
  6.     vector<string> strVec5(strVec4.size(),"ANS");  

6、容器内元素的约束

    C++语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足

以下两个约束:

    •元素类型必须支持赋值运算。

    •元素类型的对象必须可以复制。

容器操作的特殊要求

    支持复制和赋值功能是容器元素类型的最低要求。此外,一些容器操作对元素类型还有特殊要求。如果元素类型不支持这些特殊要求,则相关的容器操作就不能执行:我们可以定义该类型的容器,但不能使用某些特定的操作。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Foo  
  2. {  
  3. public:  
  4.     Foo(int x)  
  5.     {  
  6.   
  7.     }  
  8. };  
  9.   
  10. int main()  
  11. {  
  12.     vector<Foo> empty;        //OK  
  13.     vector<Foo> bad(10);  //Error  
  14.     vector<Foo> ok(10,1); //OK  
  15. }  

有在同时指定每个元素的初始化式时,才能使用给定容器大小的构造函数来创建同类型的容器对象。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值