Effective c++ 读书笔记

并不完全,更多的图表和内容请参考原书标记部分。

 

 

顺序容器

顺序容器:

vector --  支持快速随机访问

list -- 支持快速插入删除

deque -- 双端队列

 

顺序容器适配器:

stack -- 后进先出栈

queue -- 先进先出队列

priority_queue -- 有优先级管理的队列

 

 

容器内元素的类型约束:

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

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

(引用不支持一般意义的赋值运算,所以没有元素是引用类型的元素。 IO类型库不支持复制或赋值。因此也不能创建存放IO类型的对象的容器)

 

容器的容器

可以定义元素使容器类型的容器。如;

vector< vector<string> > lines;

 

迭代器(iterator)

相对于vector和deque, list容器的迭代器既不支持算术运算(加法或减法),也不支持关系运算(<=, <, >=, >),它只提供前置和后置的的自增,自荐运算以及相等(不等)运算。

 

 

9.3 顺序容器的操作

 

在顺序容器中添加成员。

所有顺序容器都支持push_back(t),在容器尾添加元素t,返回void型。

list和deque容器还支持push_front(t),返回void

在指定位置添加元素,可以用Insert(p,t),在迭代器p插入元素t,返回指向新添加元素的迭代器

还有inset(p,n,t), insert(p,b,e)等,返回void。

 

容器元素都是副本,在容器中添加元素时,系统是将元素之复制在容器里的。添加好后,容器中值与被复制的原址互不影响。

 

 

添加元素可能使迭代器失效

任何Insert或者push操作都可能导致迭代器失效,当编写循环将元素插入到vector或deque容器中是,程序必须确保迭代器在每次循环后都得到更新。

 

避免存储end操作返回的迭代器

     假设所有迭代器失效是最安全的做法。这个建议特别适用于由end操作返回的迭代器。在容器的任何位置插入任何元素都会使该迭代器失效:该迭代器既没有指向容器的元素,也不再指向容器中的超出末端的下一个位置。

      最好是每次做完插入运算后重新计算end迭代器: 

      while(first != v.end() ) {

       // do some processing

       first = v.insert( first, 42 );

       ++first;

       }

 

 

 

关系操作符

     所有容器类型都支持用关系操作符来实现两个容器的比较。比较的容器必须具有相同的容器类型,而且其元素类型也必须相同。

     使用元素提供的关系操作符实现容器的关系运算 (若存储的元素类型没有定义关系运算,则存储该种元素的容器不能比较);

 

     如果两个容器都不是对方的初始子序列,则它们的比较结果取决于所比较的第一个不相等的元素。

   

 

容器大小的操作

 c.size(), c.max_size(), c.empty(), c.resize(n),

 c.resize(n, t) -- 调整容器c的大小,使其能容纳n个元素,所有新添加的元素之都是t。 

 resize操作可能会使迭代器失效。在vector或deque容器上座resize从阿左可能会使其所有的迭代器都失效。

 对于所有容器类型,如果resize操作压缩了容器,则指向已删除的元素的迭代器失效。

 

访问元素

front和back成员将返回容器第一个或最后一个元素的引用。

对于vector和deque容器,还有 c[n] 和 c.at[n];

在调用front或者back函数之前,或者在对begin和end返回的迭代器进行解引用运算之前,必须保证该容器非空。

使用越界的下标,或者调用空容器的front或back函数,都会导致程序出现严重的错误。

而对于at成员,若给出的下标无效,at函数将会抛出out_of_range异常。

删除元素

 c.erase(p); -- 删除迭代器p所指向的元素。返回被删除元素的下一个元素。如果p指向最后一个元素,则返回超出末端的下一个位置的迭代器。如果p本身就是指向超出末端的下一位置的迭代器,则该函数未定义。

c.erase(b,e); --删除迭代器b和e所标记的范围内的所有元素。返回一个迭代器,指向被删除元素段后面的元素。如果e本身就是指向超出末端的下一个位置的迭代器,那么返回的迭代器也是指向容器超出末端的下一个位置。

c.clear(); --删除容器c内所有的元素。返回void;

c.pop_back(); -- 删除容器c的最后一个元素,返回void;若c为空容器,则该函数未定义;

c.pop_front(); --删除容器c的第一个元素,返回void;若c为空容器,则该函数未定义;只适用于list或deque容器。

*pop_front(),通常与front()操作配套使用,实现以栈的方式处理容器:

   while ( !ilist.empty() _ {

        process( ilist.front() );

        ilist.pop_front();

   }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值