博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于C++ 容器的swap操作
阅读量:6785 次
发布时间:2019-06-26

本文共 2796 字,大约阅读时间需要 9 分钟。

hot3.png

一、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 
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://my.oschina.net/u/4000302/blog/3024254

你可能感兴趣的文章
ssh配置公钥私钥(key)登录SecureCRT
查看>>
go 字符串长度为空的判断 效率
查看>>
openstack安装(liberty)--安装认证服务(Identity service)
查看>>
邮件服务器软件为企业分支“搭桥”
查看>>
Windows Azure之VM的迁移之旅
查看>>
DevOps系列——Gogs和Jenkins的CI配置
查看>>
ExtJS4.2学习(php版)
查看>>
负载均衡——HAProxy
查看>>
win7 访问本机的虚拟机中centos的web项目
查看>>
批处理之播放文本文件
查看>>
windows server 2008活动目录的备份与还原
查看>>
spring boot 2.0.1.RELEASE hibernate 缓存 ehcache 详解
查看>>
关于windows7的更新update失败,windows media play安装失败的 ...
查看>>
mysql之慢查询
查看>>
我的友情链接
查看>>
linux mysql 主主同步复制
查看>>
使用 ajax json(getJSON)从服务器读取数据,在IE下不更新问题解决
查看>>
Pythonの豆瓣相册下载脚本
查看>>
linux shell4 判断登陆用户,然后重启关闭系统
查看>>
《Cisco路由器配置与管理完全手册》(第二版)前言和目录
查看>>