#include <vector>
#include <iostream>
int main(void) {
std::vector<int> vct;
vct.push_back(99);
vct.push_back(88);
vct.push_back(77);
vct.clear();
std::cout << "vct[0]=" << vct[0] << std::endl;
return 0;
}
g++ -std=c++11 test.cpp -o test
./test
输出结果如下截图:
vct.clear();
明明已经清空了vector容器中的元素,但是还是会访问到[0]
的值。
这是因为,申请的vector的所有空间在vector析构时才会回收。
如果clear()
后再push_back()
:
std::vector<int> vct;
vct.push_back(99);
vct.push_back(88);
vct.push_back(77);
vct.clear();
vct.push_back(333);
vct.push_back(222);
vct.push_back(111);
std::cout << "vct[0]=" << vct[0] << std::endl;
结果如下图:
说明,vct.clear();
后再push_back()
的元素会重新占据[0]
及后面的内存空间。
重点来了:
这里推荐使用如下swap()
方法清空vector
容器的数据:
std::vector<int>().swap(vct);
使用上面这句代码替换vct.clear();
后,运行程序,结果如下截图:
出现段错误,访问vct[0]
越界了,因为此时vct
中已经没有元素了。
原理就是:用swap()
把vct
交换到一个新的vector
容器,将原来的vct
拷贝出去,然后自然销毁,而交换后的vct
是由std::vector<int>()
新创建的空的vector
容器,他是全新的、没有存任何数据的。
注意:swap()
不是交换两个vector
容器的地址,而是交换内容,重要的是他们会改变各自的capacity()
和size()
。
int main(void) {
std::vector<int> v1;
v1.push_back(99);
v1.push_back(88);
v1.push_back(77);
std::vector<int> v2;
v2.push_back(123);
v2.push_back(456);
std::cout << "v1的容量:" << v1.capacity() << std::endl;
std::cout << "v1的大小:" << v1.size() << std::endl << std::endl;
std::cout << "v2的容量:" << v2.capacity() << std::endl;
std::cout << "v2的大小:" << v2.size() << std::endl << std::endl;
v2.swap(v1);
std::cout << "v1,v2 swap交换后:" << std::endl << std::endl;
std::cout << "v1的容量:" << v1.capacity() << std::endl;
std::cout << "v1的大小:" << v1.size() << std::endl << std::endl;
std::cout << "v2的容量:" << v2.capacity() << std::endl;
std::cout << "v2的大小:" << v2.size() << std::endl;
// std::cout << "vct[0]=" << vct[0] << std::endl;
return 0;
}
结果如下截图:
因此,使用std::vector<int>()
新创建的空的vector
容器,他的size()
和capacity()
都为0,v1
和空容器交换后,就相当于释放了v1
的内存。
更详细的讲解可以参考博客:
std::vector中swap()函数使用解析以及去重复操作
C++ vector容器的swap方法(容器互换)