MSVC 2010的std :: vector擦除问题

时间:2018-06-26 21:24:58

标签: visual-studio-2010 c++11 vector std erase

全部

我定义了一个仅包含数据(不同类型的数据)的类。我也有std :: vector,它包含一个指向此类对象的指针。

类似这样的东西:

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

问题是擦除操作失败。当我打开调试器时,我仍然在向量中看到该元素,并且在程序完成时崩溃,因为该元素位于此处的一半。

在另一个函数中,我试图从向量中删除简单的std :: wstring,并且一切正常-删除了string并减小了向量的大小。

这种行为可能是什么问题?我当然可以尝试检查MSVC标准库中的擦除功能,但我什至不知道从哪里开始。

TIA !!!

1 个答案:

答案 0 :(得分:2)

您的循环不正确:

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:< / p>

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