23

std::setこの質問はとの両方に当てはまりますstd::unsorted_set

セット内の要素へのイテレータがあります。イテレータを使用して、セット内の位置に基づいて要素の「インデックス」を取得したいと思います。

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

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();

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

4

3 に答える 3

31

STL距離を使用します。std::distance(set.begin(), mySetIterator)

その点に注意してください:

最初と最後の間の要素の数を返します。最初から(場合によっては繰り返し)最初から最後に到達できない場合、動作は定義されません。

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

ただし、InputItがLegacyRandomAccessIteratorの要件をさらに満たす場合、複雑さは一定です。

于 2012-11-22T03:43:10.733 に答える
6

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

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

于 2012-11-22T03:43:49.923 に答える
6

std::setだけがbidirectional iteratoroperator +あります。これは、 (または)でやろうとしていることを実行できないことを意味します-。それらは、提供random access iteratorsのように、にのみ利用可能ですstd::vector

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

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

assert(it == someIterator);
于 2012-11-22T03:46:47.663 に答える