1. 程式人生 > >關於C++ 容器的swap操作

關於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 
版權宣告:本文為博主原創文章,轉載請