3

假设我有一个 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

请注意,这两个站点完全相互矛盾:这个站点说过去的迭代器不会失效clear这个站点则表明与该容器相关的所有迭代器、指针和引用都已失效。无论哪种方式,由于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 设置为一个新的空向量,因此内存中的旧点将自动被擦除干净,对吗?

4

2 回答 2

2
myVector=vector<type>();

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

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

这相当于:

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

Soswap()是首选,因为它会执行您清空向量所需的必要操作。没有额外的工作。这是惯用的,您经常会在最好的 C++ 代码中看到这一点。

operator=另一方面,除了 call 之外,还有其他一些小事情swap()。所以直接调用swap()会为你节省几个 CPU 周期。

如您所知,clear()如果您想让容量 为零(即释放内存),这还不够好。


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

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

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

希望有帮助。

于 2013-03-29T07:05:26.540 回答
1

C++11 引入了 vector::shrink_to_fit() ,它试图将向量物理收缩到它的大小。但是,不能保证这样做。请参阅此处了解更多信息。

所以,物理调整大小。你可以:

myvector.clear();
myvector.shrink_to_fit();
于 2013-03-29T07:19:03.043 回答