關於C++ 容器的swap操做

1、swap操做交換兩個相同類型的容器的內容,通常的容器(除array外),交換兩個容器內容的操做會保證很是快,由於並無交換元素自己,而只是交換了兩個容器的內部數據結構。 
拿vector作個例子:ios

#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
運行結果: .net


能夠看到,交換的是整個的內部數據結構,各元素原來所存儲的值並無發生改變,只是這些元素已經屬於不用的容器了。因此容器中所存儲的元素的內存地址也發生了改變。因此swap操做後,指向容器內部的迭代器、引用和指針都任然有效,原來綁定的是哪一個元素如今綁定的仍是哪一個元素指針

2、而swap兩個array則真正交換了各個元素:blog

#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

3、和其它容器不一樣的是,對string調用swap會致使迭代器、引用和指針失效。由於string存儲的是字符串,在string變量中真正存儲字符串的是一個叫_Ptr的指針,它指向string所存儲的字符串首地址,而字符串並無固定地址,而是存儲在一個臨時內存區域中,因此當字符串發生改變時,會發生內存的從新分配,因此會致使迭代器、引用和指針失效。io

若是以上解釋有問題,請你們及時指出噢。。。
--------------------- 
做者:imkelt 
來源:CSDN 
原文:https://blog.csdn.net/imkelt/article/details/52213735 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!容器

相關文章
相關標籤/搜索