7

ループを実行し、最後から 2 番目の要素の後で停止する最もエレガントな方法は何ですか (C++11 で)?

注: 双方向イテレータのことです。もちろん、ランダム アクセス反復子は、+and-演算子を持っているため、些細な特殊なケースです。

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;
}

これは 1 回だけ計算しますstd::prev(x.end())

于 2012-06-17T18:47:46.633 に答える