【问题标题】:C++ - Empty std::list begin() and end() are not equalC++ - 空 std::list begin() 和 end() 不相等
【发布时间】:2018-06-19 06:40:38
【问题描述】:

我正在使用以下代码遍历 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&lt;DayEntry*&gt;

根据其他答案,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;}

【问题讨论】:

  • 显示get_day_entries的定义如果此函数按值返回列表,您将得到段错误,因为临时对象列表被删除,并且您的迭代器无效。

标签: c++ list loops iterator


【解决方案1】:

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

比较来自两个不同容器的迭代器得出undefined behavior

要么保存列表的副本,要么让函数通过引用返回列表。

【讨论】:

  • 就是这样。谢谢!
  • 你对我什么时候应该返回某个东西的引用而不是它的值有一些指导吗?
  • @user96649 实际上并没有任何通用指南,这一切都必须根据返回值的使用方式逐个决定。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多