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());