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