假设我有一个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使用clear
而this 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设置为一个新的空向量,因此内存中的旧点会自动擦除清理,对吧?
答案 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();