C++ 通过删除C+中向量中的向量释放内存+;

C++ 通过删除C+中向量中的向量释放内存+;,c++,vector,C++,Vector,我有一个向量向量,我希望完全从内存中删除myvec[I],释放房间,等等。你能帮我做这件事吗?如果没有,我该怎么办?完全删除向量 如果要完全删除myvec中索引i处的向量,以便myvec[i]将不再存在,myvec.size()将比以前少一个,则应执行以下操作: myvec.erase (myvec.begin() + i); // Note that this only works on vectors 这将完全释放myvec[i]拥有的所有内存,并将其后面的所有元素移回一个位置(myvec

我有一个向量向量,我希望完全从内存中删除myvec[I],释放房间,等等。你能帮我做这件事吗?如果没有,我该怎么办?

完全删除向量 如果要完全删除
myvec
中索引
i
处的向量,以便
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
中的向量将减少一个

清空但保留向量 但是,如果您不想从
myvec
中删除
i
th向量,而只想在保留空向量的同时将其完全清空,那么可以使用几种方法

基本方法 一种常用的技术是用新的完全空的向量交换要清空的向量,如下所示:

// suppose the type of your vectors is vector<int>
vector<int>().swap (myvec[i]);
Eviscerate (myvec[i]);
一般化 您可以编写一个小函数,用于大多数(可能是所有)STL容器以及更多:

template <typename T>
void Eviscerate (T & x)
{
    T().swap (x);
}
这显然更加清晰易读,更不用说更一般了

在C++11中,您也可以使用
decltype
来编写通用解决方案(与容器和元素的类型无关),但它非常难看,我只是为了完整起见才将其放在这里:

// You should include <utility> for std::remove_reference
typename std::remove_reference<decltype(myvec[i])>::type().swap(myvec[i]);
//您应该为std::remove\u引用包含
typename std::remove_reference::type().swap(myvec[i]);
我推荐的方法是上面的
去内脏
函数。

完全移除该向量 如果要完全删除
myvec
中索引
i
处的向量,以便
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
中的向量将减少一个

清空但保留向量 但是,如果您不想从
myvec
中删除
i
th向量,而只想在保留空向量的同时将其完全清空,那么可以使用几种方法

基本方法 一种常用的技术是用新的完全空的向量交换要清空的向量,如下所示:

// suppose the type of your vectors is vector<int>
vector<int>().swap (myvec[i]);
Eviscerate (myvec[i]);
一般化 您可以编写一个小函数,用于大多数(可能是所有)STL容器以及更多:

template <typename T>
void Eviscerate (T & x)
{
    T().swap (x);
}
这显然更加清晰易读,更不用说更一般了

在C++11中,您也可以使用
decltype
来编写通用解决方案(与容器和元素的类型无关),但它非常难看,我只是为了完整起见才将其放在这里:

// You should include <utility> for std::remove_reference
typename std::remove_reference<decltype(myvec[i])>::type().swap(myvec[i]);
//您应该为std::remove\u引用包含
typename std::remove_reference::type().swap(myvec[i]);
我推荐的方法是上面的
去内脏
函数。

myvec.erase(myvec.begin()+i)
将删除
myvec[i]
完全,调用它的析构函数,并释放所有 动态分配的内存。它不会减少内存 直接由
myvec
使用:
myvec.size()
将减少1, 但是
myvec.capacity()
将保持不变。要删除最后一个 剩余部分,C++11有
myvec.shrink\u to_fit()
,这可能会删除 信息技术否则,您必须制作一份完整的
myvec
, 然后换成:

void
shrink_to_fit( MyVecType& target )
{
    MyVecType tmp( target.begin(), target.end() );
    target.swap( tmp );
}
(这基本上就是
shring___-fit
在引擎盖下的作用。) 这是一个非常昂贵的操作,实际收益很少, 至少在移除单个元件方面;如果你 正在擦除大量元素,这可能是值得的 在所有的擦除之后考虑它

最后,如果要删除所有元素,
myvec.clear()
元素,具有上述相同的注意事项。在这个
在这种情况下,创建一个空向量并交换是更好的选择
解决方案。

myvec.erase(myvec.begin()+i)
将删除
myvec[i]
完全,调用它的析构函数,并释放所有 动态分配的内存。它不会减少内存 直接由
myvec
使用:
myvec.size()
将减少1, 但是
myvec.capacity()
将保持不变。要删除最后一个 剩余部分,C++11有
myvec.shrink\u to_fit()
,这可能会删除 信息技术否则,您必须制作一份完整的
myvec
, 然后换成:

void
shrink_to_fit( MyVecType& target )
{
    MyVecType tmp( target.begin(), target.end() );
    target.swap( tmp );
}
(这基本上就是
shring___-fit
在引擎盖下的作用。) 这是一个非常昂贵的操作,实际收益很少, 至少在移除单个元件方面;如果你 正在擦除大量元素,这可能是值得的 在所有的擦除之后考虑它

最后,如果要删除所有元素,
myvec.clear()
元素,具有上述相同的注意事项。在这个
在这种情况下,创建一个空向量并交换是更好的选择

解决方案。

请您展示一些真实的代码,好吗?我不确定要展示什么代码。我在问如何删除/释放子向量的内存。例如vectormyvec;我希望释放一些随意使用的myvec的内容,那么你就没事了。如果向量包含指针,您需要首先释放指针指向的内存。似乎“删除”习惯用法需要知道要删除的值。我只是想