C++ primer 读书笔记系列——(6)顺序容器(二)

(一)删除容器内元素:

 

c.erase(p)           删除迭代器p所指向的元素

c.erase(b,e)        删除迭代器b和e所指向的范围内的元素

c.clear()              清空c中所有元素

c.pop_back()      删除容器c的最后一个元素

c.pop_first()       删除元素的第一个元素

 

 

程序输出结果为:

before delete element:
brother brother brother brother brother brother brother brother brother brother

 

after delete the first element:
brother brother brother brother brother brother brother brother brother

 

after delete all elements:
there is no elements in ivec!

 

 

(二)赋值与swap实现

 

顺序容器的赋值操作:

 

c1=c2                    删除容器c1的所有元素,然后将c2的元素复制给c1。c1和c2的类型必须相同

c1.swap(c2)          交换c1和c2的内容,该函数的执行速度比c2复制到c1执行的速率快,执行完后,迭代器依然有效

c.assign(b,e)         将迭代器b和e标记的内容复制到c中,b和e必须不是指向容器c中的元素

c.assign(n,t)          将容器重设为存储n个值为t的元素

 

1.使用assign

 

assign操作会先删除容器中指定的所有元素,然后重新进行复制操作,因此,传递给assign的迭代器不能指向调用该函数的容器内的元素;

 

疑难点:书中有这样一句话:

如果在不同类型的容器内,元素类型不同但是兼容的,则依然可以使用assign操作,如可通过assign操作实现将vector容器中的一段char*类型的元素赋给string类型的list容器。

 

但我试过,这样不可行,看如下代码:

在VC6 IDE 下出现编译出错:在ivec2.assign(ivec1.begin(),ivec1.end());这一句指示:

 

'void __thiscall std::vector<char *,class std::allocator<char *> >::assign(char *const * ,char *const * )' : cannot convert parameter 1 from 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator' to 'char *const * ';

 

而若将ivec1和ivec2均定义为vector<string>或list<string>不会出现编译错误。

是书中出错,还是我代码有误?

 

2.使用swap操作

 

关于swap操作的一个重要问题在于:该操作不会删除或插入任何元素,而且保证在常量时间内进行交换,由于容器内没有移动任何元素,因此迭代器不会失效,它们仍然指向先前元素,虽然这些元素已经存储在不同容器内了。

 

 

程序输出结果为:

before exchange:*iter1's value is:brother
after exchanger:*iter1's value is:brother

 

(三)vector容器的自增长

 

capacity和reservec成员

 

      capacity获取容器需要分配的更多的存储空间之前能够保存的元素总数,而reserve操作则告诉vector容器应该预留多少个元素的存储空间。

 

     另外,size获取容器内现有元素个数,而capacity获取新分配内存之前能够保存的元素总数。

 

 

 

程序输出结果为:

ivec's size:0
ivec's capacity:0

 

after add 25 elements,now:
ivec's size:24
ivec's capacity:32

 

after reserve to 50 ,now:
ivec's size:24
ivec's capacity:50

 

after push element to ivec untill full, now:
ivec's size:50
ivec's capacity:50

 

after push a new element, now:
ivec's size:51
ivec's capacity:100

 

 

(四)容器的选用

 

1.插入操作如何影响容器的选择:

 

list 容器表示不连续的存储区域,它允许向前和向后遍历元素,在任何位置可插入和删除元素,而且不需移动其它元素。另一方面,list容器不支持随机访问,访问某个元素需要遍历所涉及的其它元素,另外,list不提供类似vector和deque的下标访问。

 

vector 容器除了容器尾部外,在其它部位插入或删除元素都需要移动该元素之后的元素。

 

deque 容器有着更加复杂的数据结构,在其两端插入和删除元素比较都非常快。而在中间插入和删除元素所付出的代价要高些。
      

2.选择容器的提示:

 

如果要求随即访问,则用vector或deque;

如果要求在中间插入或删除元素,则用list;

如果要求在头部或尾部且不是中间位置插入或删除元素,则用deque;

 

通常来说,除非找到选择使用其它容器的更好理由,否则vector容器是最佳选择。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值