2番目(またはn番目)の項目から始まるC++イテレータのループ 質問する

2番目(またはn番目)の項目から始まるC++イテレータのループ 質問する

私は、C++ で次の操作を実行するための読みやすくエレガントな方法を探しています。ここでは Python で示します。

for datum in data[1:]:
    # do work.

問題のデータに対する反復子はランダム アクセス反復子をサポートしていない可能性があるため、次のように使用することはできません。

for (mIter = data.begin() + 1; mIter != data.end(); mIter++)

私が思いついた最良のものは次のとおりです。

iterable::iterator mIter = data.begin();
for (mIter++;  mIter != allMjds.end(); mjdIter++) {
    // do work.
}

長すぎるわけではありませんが、説明的ではありません。一見すると、実際に間違いのように見えます。

別の解決策としては、「n 番目の要素」ヘルパー関数を用意することだと思います。もっと簡潔な方法はありますか?

ベストアンサー1

使用できますstd::next(iter, n)線形時間前進の場合は、標準のstd::advanceアルゴリズムですが、使い方はそれほど簡単ではありません (非 const 参照によってイテレータを取得し、それを返しません)。

例えば、

for (mIter = std::next(data.begin()); mIter != data.end(); ++mIter)

または、

mIter = data.begin();
std::advance(mIter, 1);
for (; mIter != data.end(); ++mIter)

を必ず確認する必要がありますdata.size() >= 1。そうしないと、コードは壊滅的な失敗を起こします。

おすすめ記事