C++9.3.8 赋值与swap

来源:互联网 发布:阿里云 公网流量费用 编辑:程序博客网 时间:2024/04/30 01:31

简介

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

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

一、赋值与swap

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

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

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

c1=c2;//赋值c2给c1c1.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个元素
0 0
原创粉丝点击