7

在倒数第二个元素之后执行循环和停止的最优雅的方法是什么(在 C++11 中)?

注意:我的意思是双向迭代器;当然,随机访问迭代器是一个微不足道的特例,因为它们具有+-运算符。

std::list<double> x{1,2,3,4,5,6};

for (auto iter = x.begin(); iter != x.end(); ++iter) {
  auto iter2 = iter;
  ++iter2;
  if (iter2 == x.end()) break;
  std::cout << *iter << std::endl;
}
4

3 回答 3

15

使用std::prev功能:

std::list<double> x{1,2,3,4,5,6};

for (auto iter = x.begin(); iter != std::prev(x.end()); ++iter) {
  std::cout << *iter << std::endl;
}
于 2012-06-17T18:42:18.967 回答
5

在 C++03 中应该是:

for (std::list<double>::iterator it = x.begin(), it_last = --x.end();
     it != it_last; ++it)
{
    std::cout << *it << '\n';
}

在 C++11 中,根本没有什么不同,只是不那么冗长..:

for (auto it = begin(x), it_last = --end(x); it != it_last; ++it)
{
    std::cout << *it << '\n';
}
于 2012-06-17T18:45:03.940 回答
1

R. Martinho Fernandes 的回答略有改进:

使用std::prev功能:

std::list<double> x{1,2,3,4,5,6};

for (auto iter = x.begin(), end=std::prev(x.end()); iter != end; ++iter) {
  std::cout << *iter << std::endl;
}

这只计算:std::prev(x.end())一次。

于 2012-06-17T18:47:46.633 回答