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

C++9.3.8 赋值与swap

2015-06-08 09:16 375 查看

简介

与赋值相关的操作符都作用于整个容器

===============================================================================================================================================================

一、赋值与swap

* 与赋值相关的操作符都作用于整个容器*;

除swap外,其他操作都可以用erase和insert操作实现(删除和插入操作);

赋值操作符首先删除其左操作数容器中的所有元素,然后将右操作数容器的所有元素插入到左边容器中:

c1=c2;//赋值c2给c1
c1.erase(c1.begin(),c1.end());
c1.insert(c1.begin(),c2.begin());
//赋值后,左右两边的容器相等,尽管赋值前两个容器的长度可能不相等,但赋值后两个容器都具有右操作数的长度


赋值和assign操作使左操作数容器的所有迭代器失效。swap操作则不会使迭代器失效。

完成swap操作后,尽管被交换的元素已经存放在另一个容器中,但迭代器仍然指向相同的元素。



1.使用assign—–c.assign(b,e) 类型可以不同但是必须兼容

assign操作首先删除容器内所有的元素,然后将其参数所指定的新元素插入到该容器中。

与复制容器元素的构造函数一样,如果两个容器类型相同,其元素类型也相同,就可以使用赋值操作符

如果在不同(或相同)类型的容器内,元素类型不同但是相互兼容,则其赋值运算必须使用assign函数。

由于assign操作首先删除容器中原来存储的所有元素,因此,传递assign函数的迭代器不能指向调用该函数的容器内的元素。(参数里面的是另外一个容器)

slist1.assign(slist2.begin(),slist2.end());//等效于将slist2赋给slist1


assign运算的第二个版本需要一个整型数值和一个元素值做参数,它将容器重置为存储指定数量的元素,并且每个元素的值都为指定值

slist.assign(10,"HIya");//10个元素HIya


2.使用swap操作以节省删除元素的成本—-类型必须完全匹配,使用swap函数后,迭代器不变

swap操作实现交换两个容器内所有元素的功能。

要交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须相同。

swap函数不会删除或插入任何元素,而且保证在常量时间内实现交换由于容器内没有移动任何元素,因此迭代器不会失效。

没有移动元素这个事实意味着迭代器不会失效。他们指向同一个元素,就像没有做swap运算之前一样。虽然,在swap运算后,这些元素已经被存储在不同的容器之中了。例如,swap函数之前,有一个迭代器iter指向svec1【3】字符串;实现swap运算后,该迭代器则指向svec2【3】字符串(这是同一个字符串,只是存储在不同的容器之中而已)

有点不懂,它容器都变了,迭代器怎么算没有变呢?????

vector<string> svec1(10);//vector容器内有10个空串
vector<string> svec2(24);//vector容器内有24个空串
svec1.swap(svec2);//执行swap函数,svec1中存储24个元素,svec2中存储10个元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: