C++ Vector swap操作前后迭代器为何不失效

1 swap操作
swap是STL泛型操作的一种。这种操作的时间复杂度极低,用于两个容器内容的交换。

例如定义vector vi1和vi2, vi1.swap(vi2),就将vi1和vi2的内容交换了。

2 问题

iterator实际上是一种指针,可以指向容器的任意位置。例如vector::iterator it1 = vi1.begin();

这两个操作本身很简单,但是怪异的一点是swap前后,迭代器不失效,原来指向什么内容,swap后还是指向什么内容。

例如下面这段代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v1(10,1);
    vector<int> v2(100,2);
    vector<int>::iterator it1 = v1.begin();
    vector<int>::iterator it2 = v2.begin();
    cout<< "&v1[0]=" << &v1[0] << "\t\t" << "*it1=" <<*it1 << endl;
    cout<< "&v2[0]=" << &v2[0] << "\t\t" << "*it1=" <<*it2 << endl;
	
    v1.swap(v2);
    cout<<"after v1.swap(v2)"<<endl;
    cout<< "&v1[0]=" << &v1[0] << "\t\t" << "*it1=" <<*it1 << endl;
    cout<< "&v2[0]=" << &v2[0] << "\t\t" << "*it1=" <<*it2 << endl;
 
	return 0;
}   

结果如下:
在这里插入图片描述

结果表明:

(1)swap前后,vt1和vt2没有改变,但是&v1[0]和&v2[0]却发生了改变。
(2)实际上,交换操作的过程是这样的:
类对象地址不变,但是begin()操作指向的首地址改变,&v1[0]等效于begin操作,也改变。
而迭代器指向的是“地址”,没有改变,所以会产生这样的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值