1、swap函数交换俩个相同类型容器的内容,交换俩个容器的速度非常快,因为只交换容器的数据结构,而不交换元素值;但是如果是array调用swap函数,速度将会很慢,因为他是交换的元素值,交换速度与array大小成正比;

2、array调用swap函数,需要俩个array数据类型相同,大小相等;

交换容器的数据结构是指:交换容器元素的内存地址,并不是元素所存储的值,除string 类型外,swap函数调用完之后,迭代器、指向容器的指针、引用 均有效

void test1()
{
	vector<int> v1 = { 1,2,3,4,5,6 };
	vector<int> v2 = { 7,8,9,10,11 };
	auto t1 = v1.begin();
	auto t2 = v2.begin();
	cout << "交换前t1指向的元素为" << *t1 << endl;
	cout << "交换前t2指向的元素为" << *t2 << endl;
	cout << "交换前v1每个元素的地址和值为" << endl;
	for (const auto &t : v1)
	{
		cout << &t << " " << t << endl;
	}
	cout << "交换前v2每个元素的地址和值为" << endl;
	for (const auto &t : v2)
	{
		cout << &t << " " << t << endl;
	}
	v1.swap(v2);
	cout << "交换后t1指向的元素为" << *t1 << endl;
	cout << "交换后t2指向的元素为" << *t2 << endl;
	cout << "交换后v1每个元素的地址和值为" << endl;
	for (const auto &t : v1)
	{
		cout << &t << " " << t << endl;
	}

	cout << "交换后v2每个元素的地址和值为" << endl;
	for (const auto &t : v2)
	{
		cout << &t << " " << t << endl;
	}

}

容器上报的nacos地址变成了容器内部地址 容器swap_迭代器

从得出的结论可知,交换的是整个内部数据结构,各个元素(各个地址)所存储的值没有发生改变,只是这些元素已经属于不同的容器了。所以仅仅交换了俩个容器中元素的内存地址,所以swap操作之后,指向容器的迭代器、指针、引用依然有效,原来绑定哪个元素现在还是哪个元素;

二、array的swap();

void test1()
{
	/*vector<int> v1 = { 1,2,3,4,5,6 };
	vector<int> v2 = { 7,8,9,10,11 };
*/

	array<int,3> v1{ 1,2,3};
	array<int,3> v2{ 7,8,9};
	auto t1 = v1.begin();
	auto t2 = v2.begin();
	cout << "*t1 " <<" "<< *t1 << endl;
	cout << "*t2 " << *t2 << endl;
	cout << "exchange before v1" << endl;
	for (const auto &t : v1)
	{
		cout << &t << " " << t << endl;
	}
	cout << "exchange before v2" << endl;
	for (const auto &t : v2)
	{
		cout << &t << " " << t << endl;
	}
	v1.swap(v2);
	cout << "*t1 " << *t1 << endl;
	cout << "*t2 " << *t2 << endl;
	cout << "exchange after v1" << endl;
	for (const auto &t : v1)
	{
		cout << &t << " " << t << endl;
	}

	cout << "exchange after v2" << endl;
	for (const auto &t : v2)
	{
		cout << &t << " " << t << endl;
	}

}

容器上报的nacos地址变成了容器内部地址 容器swap_迭代器_02

 

从上图可以看到,array的swap函数,俩个array交换了各个元素的值,即容器中所存元素的地址没有变,但是元素地址所指的值发生了变化。array调用了swap函数函数后,原来的迭代器、指针、引用依然有效,原来绑定哪个地址现在依然绑定哪个地址,但是那个地址的值发生了变化,那个地址的值进行了交换;

三、string 调用了swap函数后,迭代器、指针、引用会失效;

void test1()
{
	/*vector<int> v1 = { 1,2,3,4,5,6 };
	vector<int> v2 = { 7,8,9,10,11 };
*/

	//array<int,3> v1{ 1,2,3};
	//array<int,3> v2{ 7,8,9};
	string v1{ "123" };
	string v2{ "456" };
	auto t1 = v1.begin();
	auto t2 = v2.begin();
	cout << "*t1 " <<" "<< *t1 << endl;
	cout << "*t2 " << *t2 << endl;
	cout << "exchange before v1" << endl;
	for (const auto &t : v1)
	{
		cout << &t << " " << t << endl;
	}
	cout << "exchange before v2" << endl;
	for (const auto &t : v2)
	{
		cout << &t << " " << t << endl;
	}
	v1.swap(v2);
	cout << "*t1 " << *t1 << endl;
	cout << "*t2 " << *t2 << endl;
	cout << "exchange after v1" << endl;
	for (const auto &t : v1)
	{
		cout << &t << " " << t << endl;
	}

	cout << "exchange after v2" << endl;
	for (const auto &t : v2)
	{
		cout << &t << " " << t << endl;
	}

}

容器上报的nacos地址变成了容器内部地址 容器swap_迭代器_03

因为string里面存储的是字符串,string 中有个_Ptr指针,这个指针指向字符串的首地址;但是字符串的存储在临时内存空间中,当字符串发生交换时,临时内存地址会发生变化,所以交换之后,string 迭代器、指针、引用会失效;

三、容器中的swap函数;

在vector中它占用的内存是只增不减的,调用erase 、clear函数只是将元素的大小减少,不不能将容器占用的内存减少;所以就得依赖泛型算法swap;可以将容器的内存占用缩减到“所需大小”;

注意:并不是所有的容器的clear函数都不释放内存;deque队列的clear就会将容器所占用的内存的大小释放;