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操作,也改变。
而迭代器指向的是“地址”,没有改变,所以会产生这样的效果。