当前位置:   article > 正文

关于C++ 容器的swap操作_swap可以交换哪些类型

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所存储的字符串首地址,而字符串并没有固定地址,而是存储在一个临时内存区域中,所以当字符串发生改变时,会发生内存的重新分配,所以会导致迭代器、引用和指针失效。

如果以上解释有问题,请大家及时指出噢。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/576805
推荐阅读
相关标签
  

闽ICP备14008679号