当矢量至少有1个元素时,自定义对象的std::find_if返回错误的迭代器
std::find_if for custom objects returns bad iterator when vector has at least 1 element
所以我有一个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())
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 为什么在向量上使用 std::find() 时会出现错误?
- 使用 std::find 时没有匹配的函数调用错误
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- STL std::find() C++
- 如何将 std::find() 与 2d std: 数组一起使用?
- 为什么 std::find( s.begin(), s.end(), val ) 比集合 s 的 s.find(val) 慢 1000 倍<int>?
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- 未按值排序的std::find和std::any_of
- 为什么std::map有find成员函数
- 在libc++和libstdc++之间的std::map上使用std::find时的实现差异
- 有没有办法在Cython中导入std::find find_if等?
- std::map::find 的效率是否与值的数据大小有关?
- std::string::find 为取消引用的迭代器和等效字符串文本返回不同的值
- 使用 find() 通过 std::set 的迭代器将不起作用。出了什么问题?
- Android-NDK 的 GGC/C++ 对于 std::string::find/std::getline(...) 来说似乎不稳定
- MinGW g++ cannot find std::stof
- 如何将std::find/std::find_if用于自定义类对象的向量