【问题标题】:Is it safe to use std::list as a circular list?使用 std::list 作为循环列表是否安全?
【发布时间】:2012-10-11 02:47:24
【问题描述】:

所以增加或减少 end() 迭代器是在标准中定义的?在 linux 上,begin() 被实现为 end()++。

#include <list>
#include <iostream>

int main()
{
  std::list<int> numbers;
  for (int i = 0; i < 10; i++)
    numbers.push_back(i);

  auto it = numbers.begin();
  int count = 3;
  while (count)
  {
    std::cout << *it++;
    if (it == numbers.end())
    {
      ++it; // is this ok ???
      --count;
      std::cout << '\n';
    }
  }
}

所以每个平台上的输出总是相同的?

输出:

0123456789
0123456789
0123456789

【问题讨论】:

  • ++it; 更改为 it = numbers.begin(); 并且您已经定义了行为。

标签: c++ list iterator std


【解决方案1】:

增加从任何标准 C++ 库容器的 end() 返回的迭代器会导致未定义的行为。由于std::list&lt;T&gt; 的大多数实现共有的实现细节,它可能会增加list.end(),但不能保证它会这样做。

【讨论】:

    【解决方案2】:

    不,这样不行。 std::list 迭代器是 BidirectionalIterator,它是 ForwardIterator 的改进。对于 ForwardIterator 状态,++ii++ 的前提条件:

    i 是可取消引用的

    不适用于end(),因为它指向过去列表的最后一项。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2020-10-31
      • 2016-11-22
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 2022-09-22
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多