из-за недостатка репутации Я не могу комментировать сообщение в теме:
Как получить положение определенного элемента в векторе строк, чтобы использовать его в качестве индекса в векторе ints?
Я хочу кое-что узнать об этом ответе:
Оригинальный ответ по теме:
Чтобы получить позицию элемента в векторе, зная, что итератор указывает на элемент, просто вычтите v.begin()
из итератора:
ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin();
Теперь вам нужно проверить pos
против Names.size()
, чтобы убедиться, что оно выходит за пределы:
if(pos >= Names.size()) {
//old_name_ not found
}
векторные итераторы ведут себя аналогично указателям на массивы; большая часть того, что вы знаете об арифметике указателей, может быть применена и к векторным итераторам.
Начиная с C ++ 11 вы можете использовать std::distance
вместо вычитания для итераторов и указателей:
ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
Вопросы:
- Как это работает на компиляторе? Что происходит в фоновом режиме?
Я знаю, что я передаю два итератора методу find, что выглядит логично: я передаю начальную и конечную позиции. В промежутке я ищу элемент. std :: find () возвращает итератор первого элемента, удовлетворяющий значению, переданному в качестве третьего параметра в метод std :: find (). Так что, std :: distance ничего не делает, кроме как увеличивая цикл for что-то вроде счетчика, пока не достигнет итератора «конечной точки»?
Я мог бы также написать:
int index = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
Почему лучше использовать ptrdiff_t
, чем целое число? Кто-то прокомментировал в оригинальном посте, что он позволяет хранить расстояние между любой парой итераторов в одном и том же контейнере даже в ситуациях, когда результат отрицательный. Но я не совсем понимаю смысл этого. Может быть, вы могли бы объяснить это немного дальше. (:
Я пришел из C #, где вы можете использовать что-то вроде (показано на строке):
string test = "Hello World";
int index = test.IndexOf("d");
Это кажется намного проще по сравнению с методами, использованными выше в C ++. Есть ли что-то эквивалентное в C ++?
Большое спасибо за помощь!
С уважением