C++9.3.8 赋值与swap

本文介绍了C++中容器的赋值与swap操作。赋值操作会删除左操作数容器的所有元素并插入右操作数容器的元素,导致迭代器失效。而swap操作不删除或插入元素,保持迭代器有效,要求容器类型和元素类型完全匹配。

简介

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

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

一、赋值与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个元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值