アドレスのセットの現在と次の要素を比較したいと思います。私は次のコードを試しましたセットの現在と次の要素を比較する
コンパイラは、 "it + 1"の演算子+にマッチしないというエラーを出しました。 cplusplus.comに+演算子が設定されたコンテナでサポートされていないことがわかりました。だから私は、同じifステートメントでセットの現在の要素と次の要素の両方にアクセスする方法を理解することができません。
アドレスのセットの現在と次の要素を比較したいと思います。私は次のコードを試しましたセットの現在と次の要素を比較する
コンパイラは、 "it + 1"の演算子+にマッチしないというエラーを出しました。 cplusplus.comに+演算子が設定されたコンテナでサポートされていないことがわかりました。だから私は、同じifステートメントでセットの現在の要素と次の要素の両方にアクセスする方法を理解することができません。
しかし++
が提供されているので、あなたが書くことができます。
?::iterator next = it;
next++;
+1。そして、逆参照しようとする前に 'next!= end'を保証することを忘れないでください。 –
イテレータのコピーを作成し、それを前進させて(++)、次に比較してください。標準ライブラリにある場合は、<iterator>
ライブラリのC++ 11 next
関数を使用できます。
if(it->state == std::next(it)->state)
+1は' next'のために:それは 'advance'によって残された非常に必要なギャップを埋めます。 –
すでに+
がstd::set
イテレータのためにサポートされていない事業者を出したとして、それらが唯一のbidirectional iterators
ないrandom access iterators
からです。ですから、1という現在のコピーを作成する必要が1インクリメントと同時に、次の要素にアクセスする場合:あなたはこのコードを使用してsimplyfiedすることができ、C++ 11を使用している場合
std::set<Address>::iterator next_it = it;
++next_it;
if(it->state == (next_it)->state)
(基本的には同じことを)<iterator>
で見つかったstd::next
機能:もちろん
if(it->state == std::next(it)->state)
その関数を書いては非常に簡単ですので、事前にC++ 11をコーディングするときは、必ずnext
あなた自身を書くことができます。
はまた:次のイテレータはset.end()
'のstd :: set'と等しくないユニークな要素が含まれていることを確認することを忘れないでください。等価チェックを実行すると常にfalseが返されます。 – hmjd
@hmjd:オブジェクトの一部だけが比較され、オブジェクトの比較がどのように実装されているかわからないため、必ずしも必要ではありません。 – Grizzly
@Grizzly、true。平等は 'state'のみにあることに気付きました。 – hmjd