(一)删除容器内元素:
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容器是最佳选择。