получение "индекса" элемента set через итератор [дубликат]

этот вопрос уже есть ответ здесь:

этот вопрос относится как к 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();

есть ли способ использовать итератор для получения значения Индекса, подобного этому, на основе его местоположения в наборе?

3 ответов


расстояние STL - это то, что вам нужно. std::distance(set.begin(), find_result)

обратите внимание:

"возвращает количество элементов между первым и последним. The поведение неопределено если last не доступен с первого (возможно, многократно), сначала увеличивая. "

Примечание: сложность линейна;


std::set и set::unordered_set are ассоциативные контейнеры, а не последовательность контейнеры, следовательно, сама концепция индекса не имеет большого смысла.

Если вам нужно получить индекс для ассоциативного контейнера, то дизайн должен быть изменен (даже потому, что без концепции наименьшего или последнего вставленного элемента индексы в таких контейнерах могут быть изменены).


std::set и просто bidirectional iterator, что означает, что вы не можете делать то, что ты пытаешься сделать с operator + (или -). Они доступны только для 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);