删除和删除向量中的所有对象

时间:2013-03-29 07:00:08

标签: c++ std

假设我有一个ivar vector<type> myVector;

我向此向量添加项目。

稍后,我想将矢量“重置”为空,并再次添加项目。

任何人都可以确认以下情况属实:

myVector.clear(); //removes objects but does not remove memory occupied by prior full size of the vector, even though the vector is now empty with a size of 0

请注意,这两个网站完全相互矛盾:This one使用clearthis one代替过去结束的迭代器未通过表示与此容器相关的所有迭代器,指针和引用都无效。无论哪种方式,由于capacity未更改,因此这并未真正“重置”vector

void someFunction(){
   vector<type> emptyVector;
   myVector.swap(emptyVector);
} // function terminates, thus the prior contents of myVector are deleted when emptyVector goes out of scope

这似乎是最好的方法,我认为它实现了同样的目的:

myVector.swap(vector<type>());

现在,这比仅仅这样做更好还是更坏:

myVector=vector<type>();

这只会将整个shebang设置为一个新的空向量,因此内存中的旧点会自动擦除清理,对吧?

2 个答案:

答案 0 :(得分:2)

myVector=vector<type>();

std::vector的大多数实现都将上述内容视为copy-and-swap,意味着内部执行此操作,

vector<type>().swap(*this); //inside the operator=

相当于:

vector<type>().swap(myVector);

所以swap()是首选,因为这样做了为了清空向量所需要的东西。没有额外的工作。这是惯用的,你会经常在最好的C ++代码中看到它。

另一方面,operator=会在调用swap()之外做其他小事。因此直接调用swap()可以节省几个CPU周期。

如您所知,如果您想要容量 (即释放内存),clear()就不够好。


请注意,以下内容不会编译:

myVector.swap(vector<type>()); //compilation error

这是因为std::vector::swap通过非const引用接受参数,这意味着临时对象无法绑定它。

希望有所帮助。

答案 1 :(得分:1)

C ++ 11引入了vector :: shrink_to_fit(),它试图将矢量物理缩小到它的大小。但是不能保证这样做。 See Here了解更多信息。

所以,要实际调整大小。你可以:

myvector.clear();
myvector.shrink_to_fit();