關於C++ 容器的swap操作
一、swap操作交換兩個相同型別的容器的內容,一般的容器(除array外),交換兩個容器內容的操作會保證非常快,因為並沒有交換元素本身,而只是交換了兩個容器的內部資料結構。
拿vector做個例子:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> ivec1{ 1,2,3 };
std::vector<int> ivec2{ 4,5,6 };
std::cout << "ivec1各元素的地址和值 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &ivec1[i] << " " << ivec1[i] << " ";
}
std::cout << std::endl;
std::cout << "ivec2各元素的地址 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &ivec2[i] << " " << ivec2[i] << " ";
}
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
swap(ivec1, ivec2);
std::cout << "ivec1各元素的地址 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &ivec1[i] << " " << ivec1[i] << " ";
}
std::cout << std::endl;
std::cout << "ivec2各元素的地址 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &ivec2[i] << " " << ivec2[i] << " ";
}
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
執行結果:
可以看到,交換的是整個的內部資料結構,各元素原來所儲存的值並沒有發生改變,只是這些元素已經屬於不用的容器了。所以容器中所儲存的元素的記憶體地址也發生了改變。所以swap操作後,指向容器內部的迭代器、引用和指標都任然有效,原來繫結的是哪個元素現在繫結的還是哪個元素
二、而swap兩個array則真正交換了各個元素:
#include <iostream>
#include <array>
int main()
{
std::array<int, 3> arr1{ 1,2,3 };
std::array<int, 3> arr2{ 4,5,6 };
std::cout << "arr1各元素的地址和值 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &arr1[i] << " " << arr1[i] << " ";
}
std::cout << std::endl;
std::cout << "arr2各元素的地址 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &arr2[i] << " " << arr2[i] << " ";
}
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
swap(arr1, arr2);
std::cout << "arr1各元素的地址 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &arr1[i] << " " << arr1[i] << " ";
}
std::cout << std::endl;
std::cout << "arr2各元素的地址 : " << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << &arr2[i] << " " << arr2[i] << " ";
}
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
執行結果:
可以看到,交換後,兩個array交換了各個元素的值,即容器中所存的各個元素的記憶體地址並沒有交換,只是交換了相應位置的元素的值,所以說swap兩個array所需的時間和array中元素的數目成正比,同時,swap操作後,指向容器內部的迭代器、引用和指標都任然有效,原來繫結的是哪個元素現在繫結的還是哪個元素,只不過對應的元素值已經進行了交換。
三、和其它容器不同的是,對string呼叫swap會導致迭代器、引用和指標失效。因為string儲存的是字串,在string變數中真正儲存字串的是一個叫_Ptr的指標,它指向string所儲存的字串首地址,而字串並沒有固定地址,而是儲存在一個臨時記憶體區域中,所以當字串發生改變時,會發生記憶體的重新分配,所以會導致迭代器、引用和指標失效。
如果以上解釋有問題,請大家及時指出噢。。。
---------------------
作者:imkelt
來源:CSDN
原文:https://blog.csdn.net/imkelt/article/details/52213735
版權宣告:本文為博主原創文章,轉載請