Как получить положение определенного элемента в векторе строк, чтобы использовать его в качестве индекса в векторе ints?
Я пытаюсь получить индекс элемента в векторе strings, чтобы использовать его в качестве индекса в другой вектор int типа, это возможно ?
пример:
vector <string> Names;
vector <int> Numbers;
...
// condition to check whether the name exists or not
if((find(Names.begin(), Names.end(), old_name_)) != Names.end())
{ // if yes
cout <<"Enter the new name."<< endl;
cin >> name;
replace(Names.begin(), Names.end(), old_name_, name);
}
теперь я хочу получить должность old_name на Names вектор, чтобы использовать его в доступе к определенному элементу в Numbers вектор. Так что я могу сказать:
Numbers[position] = 3 ; // or whatever value assigned here.
Я пробовал использовать:
vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;
но, очевидно, это не работает с pos имеет тип string !
2 ответа:
чтобы получить положение элемента в векторе, зная итератор, указывающий на элемент, просто вычесть
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_));
Если вы хотите индекс, вы можете использовать
std::findв сочетании сstd::distance.auto it = std::find(Names.begin(), Names.end(), old_name_); if (it == Names.end()) { // name not in vector } else { auto index = std::distance(Names.begin(), it); }