我正在使用以下代码迭代std :: list:
std::cout << "size: " << get_day_entries().size() << "\n";
for (std::list<DayEntry*>::iterator it = get_day_entries().begin(); it != get_day_entries().end(); ++it){
(*it)->print();
if ((*it)->get_date()->compare(*date)){
std::cout << "FOUND: \n";
(*it)->print();
return (*it);
}
}
当列表不为空时,我得到未定义的行为;它似乎超过了列表的末尾。 当列表为空(size()返回0)时,它仍然进入循环和段错误,因为它是空的。
为什么它在空时迭代到列表中?为什么它看起来不合适呢?
get_day_entries()
返回std::list<DayEntry*>
。
根据其他答案,C ++标准表示对于空列表begin() == end()
,但此代码不会输入空列表的条件:
if (get_day_entries().begin() == get_day_entries().end())
std::cout << "EQUALS\n";
以下是get_day_entries()
的代码:
std::list<DayEntry*> get_day_entries(){return m_day_entries;}
答案 0 :(得分:4)
我 猜测 (因为您没有提供Minimal, Complete, and Verifiable Example)函数get_day_entries()
返回列表值。这意味着您可以从两个不同的列表获得开始和结束迭代器。
比较两个不同容器的迭代器会导致undefined behavior。
保存列表副本,或使该功能通过引用返回列表。
答案 1 :(得分:1)
使用提供的代码是不确定的,但我想您的函数get_day_entries()
每次调用时都会创建新列表(例如,通过按值返回,而不是通过引用返回)。通过这样做,他们的迭代器应该 NOT 进行比较,并且可能(并且很可能不会)给出正确的结果。比较来自不同conatiners的迭代器会导致 undefined baheviour 。