std::vector MSVC 2010 的擦除问题
std::vector erase issue with MSVC 2010
全部,
我定义了一个 class 只保存数据(不同类型的数据)。我也有 std::vector 包含指向此 class.
对象的指针
像这样:
class Foo
{
};
class Bar
{
private:
std::vector<Foo *> m_fooVector;
};
在我的程序中的某个时间点,我想从此向量中删除一个元素。所以我写了以下内容:
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it <= m_fooVector.end(); )
{
if( checking it condition is true )
{
delete (*it);
(*it) = NULL;
m_fooVector.erase( it );
}
}
问题是擦除操作失败。当我打开调试器时,我仍然在 vector 中看到这个元素,当程序完成时它崩溃了,因为这个元素在一半的地方。
在另一个函数中,我试图从向量中删除简单的 std::wstring 并且一切正常 - 字符串被删除并且向量的大小减小。
这种行为可能有什么问题?我当然可以尝试检查 MSVC 标准库中的擦除功能,但我什至不知道从哪里开始。
TIA!!!
你的循环不正确:
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); )
{
if (/*checking it condition is true*/)
{
delete *it;
// *it = NULL; // Not needed
it = m_fooVector.erase(it);
} else {
++it;
}
}
传统方法是 erase-remove idiom,但由于您必须先调用 delete
(智能指针会避免此问题),您可以使用 std::partition
而不是 std::remove
:
auto it = std::partition(m_fooVector.begin(), m_fooVector.end(), ShouldBeKeptFunc);
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); ++it) {
delete *it;
}
m_fooVector.erase(it, m_fooVector.end());
全部,
我定义了一个 class 只保存数据(不同类型的数据)。我也有 std::vector 包含指向此 class.
对象的指针像这样:
class Foo
{
};
class Bar
{
private:
std::vector<Foo *> m_fooVector;
};
在我的程序中的某个时间点,我想从此向量中删除一个元素。所以我写了以下内容:
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it <= m_fooVector.end(); )
{
if( checking it condition is true )
{
delete (*it);
(*it) = NULL;
m_fooVector.erase( it );
}
}
问题是擦除操作失败。当我打开调试器时,我仍然在 vector 中看到这个元素,当程序完成时它崩溃了,因为这个元素在一半的地方。
在另一个函数中,我试图从向量中删除简单的 std::wstring 并且一切正常 - 字符串被删除并且向量的大小减小。
这种行为可能有什么问题?我当然可以尝试检查 MSVC 标准库中的擦除功能,但我什至不知道从哪里开始。
TIA!!!
你的循环不正确:
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); )
{
if (/*checking it condition is true*/)
{
delete *it;
// *it = NULL; // Not needed
it = m_fooVector.erase(it);
} else {
++it;
}
}
传统方法是 erase-remove idiom,但由于您必须先调用 delete
(智能指针会避免此问题),您可以使用 std::partition
而不是 std::remove
:
auto it = std::partition(m_fooVector.begin(), m_fooVector.end(), ShouldBeKeptFunc);
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); ++it) {
delete *it;
}
m_fooVector.erase(it, m_fooVector.end());