C++中vector的容器互换

#include <iostream>
#include <vector>

using namespace std;

//打印
void printVector(vector<int> &v1) {
    for (vector<int>::iterator iterator = v1.begin(); iterator != v1.end(); iterator++) {
        cout  << *iterator << " ";
    }
    cout << endl;
}

//基本使用
void test01(){
    cout << "交换前" <<endl;
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    cout << "v1:" ;
    printVector(v1);//v1:10 20 30 40 50

    vector<int> v2;
    v2.push_back(50);
    v2.push_back(40);
    v2.push_back(30);
    v2.push_back(20);
    v2.push_back(10);
    cout << "v2:" ;
    printVector(v2);//v2:50 40 30 20 10

    cout << "交换后" <<endl;
    //对两个vector进行交换
    v1.swap(v2);
    cout << "v1:" ;
    printVector(v1);//v1:50 40 30 20 10
    cout << "v2:" ;
    printVector(v2);//v2:10 20 30 40 50

}

//实际用途
//巧用swap可以收缩内存空间
void test2(){
    vector<int> v1;
    for (int i = 0; i < 9999; ++i) {
        v1.push_back(i);
    }
    cout << "v的容量为:" << v1.capacity() << endl;//v的容量为:16384
    cout << "v的大小为:" << v1.size() << endl;//v的大小为:9999

    //重新指定大小为3,容量依旧很大,空间浪费
    v1.resize(3);
    cout << "v的容量为:" << v1.capacity() << endl;//v的容量为:16384
    cout << "v的大小为:" << v1.size() << endl;//v的大小为:3
    
    //巧用swap来收缩容量
    vector<int> (v1).swap(v1);
    cout << "v的容量为:" << v1.capacity() << endl;//v的容量为:3
    cout << "v的大小为:" << v1.size() << endl;//v的大小为:3
}

int main(){
//    test01();
    test2();
    return 0;
}

vector (v1).swap(v1);解析:

  1. vector (v1) 是一个匿名对象,匿名对象调用了vector的拷贝构造,生成一个新的对象。
  2. 这个对象数据与v1一样,但是容量只会开辟3个(也就是v1的size)
  3. 两个进行地址互换,v1指向匿名对象的地址,匿名对象指向v1的地址。v1的数据已经拷贝过去,所以数据不会丢失,容量与大小(数据个数)相等。
  4. 匿名对象执行完毕,被系统回收,v1的原地址释放。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值