我有一个向量载体,我希望从内存中完全删除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/