Как получить положение определенного элемента в векторе строк, чтобы использовать его в качестве индекса в векторе ints? (= оригинальное название темы) - PullRequest
0 голосов
/ 16 января 2019

из-за недостатка репутации Я не могу комментировать сообщение в теме:

Как получить положение определенного элемента в векторе строк, чтобы использовать его в качестве индекса в векторе 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_));

Вопросы:

  1. Как это работает на компиляторе? Что происходит в фоновом режиме?

Я знаю, что я передаю два итератора методу find, что выглядит логично: я передаю начальную и конечную позиции. В промежутке я ищу элемент. std :: find () возвращает итератор первого элемента, удовлетворяющий значению, переданному в качестве третьего параметра в метод std :: find (). Так что, std :: distance ничего не делает, кроме как увеличивая цикл for что-то вроде счетчика, пока не достигнет итератора «конечной точки»?

  1. Я мог бы также написать:

    int index = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
    

Почему лучше использовать ptrdiff_t, чем целое число? Кто-то прокомментировал в оригинальном посте, что он позволяет хранить расстояние между любой парой итераторов в одном и том же контейнере даже в ситуациях, когда результат отрицательный. Но я не совсем понимаю смысл этого. Может быть, вы могли бы объяснить это немного дальше. (:

  1. Я пришел из C #, где вы можете использовать что-то вроде (показано на строке):

    string test = "Hello World";
    int index = test.IndexOf("d");
    

Это кажется намного проще по сравнению с методами, использованными выше в C ++. Есть ли что-то эквивалентное в C ++?

Большое спасибо за помощь!

С уважением

...