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

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);
}