C ++ - Empty std :: list begin()和end()不相等

时间:2018-06-19 06:40:38

标签: c++ list loops iterator

我正在使用以下代码迭代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;}

2 个答案:

答案 0 :(得分:4)

猜测 (因为您没有提供Minimal, Complete, and Verifiable Example)函数get_day_entries()返回列表。这意味着您可以从两个不同的列表获得开始和结束迭代器。

比较两个不同容器的迭代器会导致undefined behavior

保存列表副本,或使该功能通过引用返回列表

答案 1 :(得分:1)

使用提供的代码是不确定的,但我想您的函数get_day_entries()每次调用时都会创建新列表(例如,通过按值返回,而不是通过引用返回)。通过这样做,他们的迭代器应该 NOT 进行比较,并且可能(并且很可能不会)给出正确的结果。比较来自不同conatiners的迭代器会导致 undefined baheviour