Я должен ухаживать и возвратить индекс элемента двухсторонней очереди, на который указывает итератор. Как я вытаскиваю интервал из итератора?
Из двух представленных методов:
std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator));
и
std::ptrdiff_t index = some_iterator - some_deque.begin()
... последний имеет преимущество в том, что он применим только к итераторам с произвольным доступом - следовательно, при замене другого контейнера вы не будет случайно получить дорогостоящую операцию (например, O (n) для списков).
Вы можете использовать:
std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator));
Помните о затратах времени выполнения такой подпрограммы, однако это зависит от структуры данных, которую вы используете.
std::ptrdiff_t index = std::distance(myDeque.begin(), curIterator);
Для итераторов с произвольным доступом вы можете просто использовать вычитание:
size_t index = some_iterator - some_deque.begin()
Очевидно, что это не работает для всех итераторов (например, для std :: list
или чего-то еще), но я бы сказал, что есть определенная элегантность в том, что вы можете использовать эту технику только тогда, когда на это потребуется постоянное время. Если в вашем контейнере нет итераторов с произвольным доступом, то, скорее всего, все равно нецелесообразно пытаться найти их индекс.