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