当矢量至少有1个元素时,自定义对象的std::find_if返回错误的迭代器

std::find_if for custom objects returns bad iterator when vector has at least 1 element

本文关键字:find std if 迭代器 错误 返回 对象 自定义 1个 元素      更新时间:2023-10-16

所以我有一个Player类型的对象向量。如果我尝试在该向量上使用std::find_If,并使用一个lambda表达式,该表达式仅在播放器是我要检查的名称时才返回true,那么如果向量为空(就像迭代器中的nullptr一样),它将在第一次起作用,但一旦我在向量中添加player对象,find_If将返回一个充满随机错误数据的迭代器。

我的代码:

    auto player = find_if(m_playerList.begin(), m_playerList.end(), [name](Player& p)
    { 
        return p.Name == name;
    });
    if (player._Ptr != nullptr)
    {
        // Do stuff
    }
    else
    {
        Player newPlayer;
        newPlayer.Name = name;
        m_playerList.push_back(newPlayer);
    }

因此,在这个函数的第一次迭代中,播放器是nullptr,因为向量不包含任何元素。在第二次迭代中,如果我用相同的名称搜索,它会在向量中找到它,但如果我用不同的名称搜索时,它会返回一个带有损坏的随机数据的对象,并通过检查"if(player._Ptr!=nullptr)"。

问题是,是什么导致了这种情况?我是否正确地检查了"播放器"对象,以确定find_if是否真的在向量中找到了一个有效的对象?

您编写的代码是不可移植的,因为它使用了vector::iterator的特定于实现的_Ptr成员,因此不要求该成员为nullptr。更改

if (player._Ptr != nullptr)

if (player != m_playerList.end())