2012-11-22 8 views
9

この質問はstd::setstd::unsorted_setの両方に当てはまります。イテレータを介してset要素の "index"を取得する

私は、セットの要素に対するイテレータを持っています。私はイテレータを使用して、要素内の位置に基づいて要素の「インデックス」を取得したいと考えています。例えば

次のように、私のセットのためのインデックスは次のようになります。

int index = 0; 

for(MySetType::iterator begin = mySet.begin(); begin != mySet.end(); begin++) 
{ 
    cout << "The index for this element is " << index; 
    index++; 
} 

私はイテレータを用いた演算を行って試してみましたが、それは動作しません:

int index = mySetIterator - mySet.begin(); 

はにどのような方法がありますイテレータを使用して、セット内の位置に基づいてこのようなインデックス値を取得しますか?

+0

2回の反復子との間の "距離" を得るための正しい方法は[ 'のstd :: distance'(http://en.cppreference.com/w/cpp/iterator/distance)関数です。しかし、使用する前にJackの答えをお読みください。 –

答えて

13

STL distanceが必要です。 std::distance(set.begin(), find_result)

ことに注意してください。

は「最初と最後の間の要素の数を返します動作は未定義で最後は最初のインクリメント(おそらく繰り返し)によって最初から到達できない場合。。」

備考:複雑さは線形です。

3

std::setset::unordered_setので、インデックスの概念自体はあまり意味がありません、連想コンテナ、ないシーケンスコンテナです。

関連するコンテナのインデックスを取得する必要がある場合は、デザインを変更する必要があります(最小または最新の挿入された要素のコンセプトがない場合でも、そのようなコンテナのインデックスは変更される可能性があります)。

+0

ファイルに書き込むことができる方法でアイテムを設定するために、要素(イテレータ)をリンクするための "インデックス"が必要です。言い換えれば、大規模な反復子リストがあり、同じ冗長セット要素データをファイルに書きたくないということです。一意の集合要素を1つのファイルに書き込んだり、各要素のインデックスを作成して、それらを特定のセット項目にリンクし直したいと思います。 – user974967

4

std::set has just a bidirectional iteratorこれは、operator +(または-)で行うことができないことを意味します。これらはrandom access iteratorsstd::vectorなど)にのみ提供されています。

「インデックス」を取得するにはstd::distanceを使用し、セットの先頭から末尾に移動するにはstd::advanceを使用する必要があります。

auto distance = std::distance(mySet.begin(), someIterator); 
auto it = mySet.begin(); 
std::advance(it, distance); 

assert(it == someIterator); 
+0

distance()関数の時間計算量はどのように設定されますか?それはO(1)ですか? – Prince

+1

いいえ、 'set'は' bidirectional iterator'しか持たないので、 'distance'はリストを歩かなければなりません。もしそれが 'ランダムアクセス反復子'を持っていたら、それはO(1)かもしれません。 – moswald

関連する問題