7

C++

次の反復ループがあります。

for (it = container.begin(); it != container.end(); ++it) {
    //my code here
}

このイテレーション 1 要素を早く終了したい。次のことを試しましたが、コンパイルされません。

for (it = container.begin(); it != container.end() - 1; ++it) { //subtract 1
    //my code here
}

これはどのように行うことができますか?ありがとう。

4

5 に答える 5

13

コンテナが空である可能性を考慮して、セットstd::prev(s.end())がどこにあるかの前に 1 つまで繰り返すことができます。s

#include <iterator> // for std::prev

auto first = s.begin();
auto last = s.empty() ? s.end() : std::prev(s.end()); // in case s is empty
for (auto it = first; it != last; ++it) { ... }

: std::prevC++11 のサポートが必要です。C++03 の代替は--s.end().

于 2013-03-22T19:17:30.267 に答える
2

試してくださいstd::prev

for (it = container.begin(); it != std::prev(container.end()); ++it) { //subtract 1
    //my code here
}
于 2013-03-22T19:16:44.563 に答える
0

result->container.end() - 1ランダムアクセス反復子が必要ですが、双方向反復子しかありません。代わりに、おそらく必要です--result->container.end()

また、大したことではありませんが、毎回再計算したくない場合もあります。

for (auto i(begin(result->container)), e(--end(result->container)); i!=e; ++i) {
于 2013-03-22T19:18:44.757 に答える
0
for (it = container.begin(); it != --result->container.end(); ++it) { //subtract 1
    //my code here
}

std::set::iterator双方向です。これは、実行できることを意味し--ます++-ただし、ランダムアクセス反復子の要件を満たしていないため、それを行うことはできません+

于 2013-03-22T19:17:02.953 に答える
0

最後のイテレータを見つけるための C++98 ソリューションは次のようになります。

set.find(*set.rbegin())

別のオプションですが、文書化されておらず、推奨されていません

it!= --set.end()

セットが空の場合、その動作は未定義でなければなりません (begin == end)

于 2017-08-21T08:42:24.660 に答える