2012-01-07 7 views
0

アドレスのセットの現在と次の要素を比較したいと思います。私は次のコードを試しましたセットの現在と次の要素を比較する

コンパイラは、 "it + 1"の演算子+にマッチしないというエラーを出しました。 cplusplus.comに+演算子が設定されたコンテナでサポートされていないことがわかりました。だから私は、同じifステートメントでセットの現在の要素と次の要素の両方にアクセスする方法を理解することができません。

+0

'のstd :: set'と等しくないユニークな要素が含まれていることを確認することを忘れないでください。等価チェックを実行すると常にfalseが返されます。 – hmjd

+2

@hmjd:オブジェクトの一部だけが比較され、オブジェクトの比較がどのように実装されているかわからないため、必ずしも必要ではありません。 – Grizzly

+0

@Grizzly、true。平等は 'state'のみにあることに気付きました。 – hmjd

答えて

1

しかし++が提供されているので、あなたが書くことができます。

?::iterator next = it; 
next++; 
+0

+1。そして、逆参照しようとする前に 'next!= end'を保証することを忘れないでください。 –

1

イテレータのコピーを作成し、それを前進させて(++)、次に比較してください。標準ライブラリにある場合は、<iterator>ライブラリのC++ 11 next関数を使用できます。

if(it->state == std::next(it)->state) 
+0

+1は' next'のために:それは 'advance'によって残された非常に必要なギャップを埋めます。 –

0

すでに+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()

関連する問題