您的位置:首页 > 编程语言 > C语言/C++

C++容器的拷贝注意细节

2015-11-27 10:27 302 查看
为了创建一个容器为另一个容器的拷贝,两个容器的类型以及元素类型必须匹配。当传递参数为两个迭代参数用来拷贝时,就不需要容器类型是相同的了,而且严肃类型也不要求是相同的,只需要将考别的严肃转换为对应的元素类型即可。如图中实例:



c为一容器,c= {a,b,c,d,e,f…}将c种元素替换为初始化列表中的数据,但是对array不适用。

采用swap函数交换两个容器的元素时,对vector等元素不会移动,故其迭代器仍然有效,且减缓时间非常快,是一个常熟时间,但是对array的swap函数就会真正交换他们的元素,故交换时间与他们所含元素的数量成正比,交换后迭代器指向的已经是另一个array中所指向的元素了。即指向的值发生了改变。

swap函数有层原函数版本和非成员函数版本,推荐非成员函数版本,即swap(c1,c2);版本。

当我们用一个对象来初始化容器时,或者将一个对象插入到容器中时,司机上放入容器的是对象的拷贝,而不是对象本身,这与我们将对象传递给非引用参数一样,对容器中元素的修改不会影响到原始对象。

解引用c.end()–才能够得到容器最后一个元素,c.end()指向的是最后一个元素的后一个位置。

at()操作只支持vector、deque、array、string不支持list。可以这样里理解,at为随机访问,而list为链式存储,故不支持。

当进行大多数操作时,容器的尾后迭代器都会失效,故不要保存end返回的迭代器,而应该每次处理完相应的模块后均从新定位尾后迭代器。否则会产生灾难性后果。如下代码:

//不安全,迭代器失效
auto beg = v.begin();
auto end = v.end();
while(beg!= end){
beg = v.insert(beg,21);
++beg;
}

//正确的写法
while(beg!= v.end()){//每次从新定位尾后迭代器
beg = v.insert(beg,21);
++beg;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  容器-c++