std::find_if 对于自定义对象 returns 当向量至少有 1 个元素时迭代器错误
std::find_if for custom objects returns bad iterator when vector has at least 1 element
所以我有一个类型为 Player 的对象向量。如果我尝试在该向量上使用 std::find_if 并使用一个 lambda 表达式 return 只有当玩家的名字是我要检查的名字时才为真,如果向量是空的(因为在迭代器中是 nullptr),但是一旦我在向量中添加一个 Player 对象,find_if 将 return 一个迭代器填充随机的坏数据。
我的代码:
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,因为向量不包含任何元素。在第二次迭代中,如果我用相同的名称搜索,它会在向量中找到它,但是如果我用不同的名称搜索,它 return 是一个具有损坏的随机数据的对象和检查 [=21= 】 通过。
问题是,这是什么原因造成的?我是否正确检查了 "player" 对象以确定 find_if 是否真的在向量中找到了一个有效对象?
您编写的代码不可移植,因为它使用 vector::iterator
的特定于实现的 _Ptr
成员,因此没有要求该成员必须是 nullptr
。变化
if (player._Ptr != nullptr)
至
if (player != m_playerList.end())
所以我有一个类型为 Player 的对象向量。如果我尝试在该向量上使用 std::find_if 并使用一个 lambda 表达式 return 只有当玩家的名字是我要检查的名字时才为真,如果向量是空的(因为在迭代器中是 nullptr),但是一旦我在向量中添加一个 Player 对象,find_if 将 return 一个迭代器填充随机的坏数据。
我的代码:
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,因为向量不包含任何元素。在第二次迭代中,如果我用相同的名称搜索,它会在向量中找到它,但是如果我用不同的名称搜索,它 return 是一个具有损坏的随机数据的对象和检查 [=21= 】 通过。
问题是,这是什么原因造成的?我是否正确检查了 "player" 对象以确定 find_if 是否真的在向量中找到了一个有效对象?
您编写的代码不可移植,因为它使用 vector::iterator
的特定于实现的 _Ptr
成员,因此没有要求该成员必须是 nullptr
。变化
if (player._Ptr != nullptr)
至
if (player != m_playerList.end())