我有一个向量载体,我希望从内存中完全删除myvec [i],释放空间,依此类推。 .erase或.clear会为我完成这项工作吗?如果没有,我该怎么办?

最佳答案

完全删除向量

如果要完全删除i中索引为myvec的向量,以使myvec[i]不再存在并且myvec.size()比以前少一个,则应执行以下操作:

myvec.erase (myvec.begin() + i); // Note that this only works on vectors


这将完全取消分配myvec[i]拥有的所有内存,并将其后的所有元素(myvec[i + 1]myvec[i + 2]等)移回一个位置,以使myvec中的向量减少一个。

清空但保留向量

但是,如果您不想从i中删除​​第myvec个矢量,而只想在将空矢量保持在原位置的同时将其完全清空,则可以使用多种方法。

基本方法

常用的一种技术是使用新的完全空的向量swap要清空的向量,如下所示:

// suppose the type of your vectors is vector<int>
vector<int>().swap (myvec[i]);


这样可以保证释放myvec[i]中的所有内存,速度很快,而且不会分配任何新的堆内存或任何东西。

之所以使用它,是因为方法clear不提供这种保证。如果您clear向量,它总是将其大小始终设置为零并破坏所有元素,但实际上(取决于实现)可能没有释放内存。

在C ++ 11中,您可以通过两个函数调用来完成所需的操作:(感谢有用的注释)

myvec[i].clear();
myvec[i].shrink_to_fit();


概括

您可以编写一个适用于大多数(可能是所有)STL容器以及更多其他容器的小函数:

template <typename T>
void Eviscerate (T & x)
{
    T().swap (x);
}


您可以这样使用:

Eviscerate (myvec[i]);


显然,这更干净,更易读,更不用说更笼统了。

在C ++ 11中,您还可以使用decltype编写通用解决方案(与您的容器和元素的类型无关),但这非常丑陋,为了完整起见,我仅将其放在此处:

// You should include <utility> for std::remove_reference
typename std::remove_reference<decltype(myvec[i])>::type().swap(myvec[i]);


我推荐的方法是上面的Eviscerate函数。

关于c++ - 通过在C++中删除 vector 中的 vector 来释放内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17131326/

10-10 07:24