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

时间:2015-02-28 22:53:36

标签: c++ c++11 vector

所以我有一个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是否实际在向量中找到了有效对象?

1 个答案:

答案 0 :(得分:2)

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

if (player._Ptr != nullptr)

if (player != m_playerList.end())