получение "индекса" элемента set через итератор [дубликат]
этот вопрос уже есть ответ здесь:
- индекс или позиция в std:: set 3 ответы
этот вопрос относится как к 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);