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

Ответ 1

Чтобы получить позицию элемента вектора, знающего итератор, указывающий на элемент, просто вычтите 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
}

векторные итераторы ведут себя аналогично указателям массива; большинство из того, что вы знаете об арифметике указателя, можно применить и к векторным итераторам.

Начиная с С++ 11 вы можете использовать std::distance вместо вычитания для обоих итераторов и указателей:

ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));

Ответ 2

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

Ответ 3

Я начинающий, так что вот ответ для начинающих. Цикл if в for дает i, который затем может быть использован, как это необходимо, например, Numbers [i] в другом векторе. Больше всего пух для примера, для/если действительно говорит все это.

int main(){
vector<string>names{"Sara", "Harold", "Frank", "Taylor", "Sasha", "Seymore"};
string req_name;
cout<<"Enter search name: "<<'\n';
cin>>req_name;
    for(int i=0; i<=names.size()-1; ++i) {
        if(names[i]==req_name){
            cout<<"The index number for "<<req_name<<" is "<<i<<'\n';
            return 0;
        }
        else if(names[i]!=req_name && i==names.size()-1) {
            cout<<"That name is not an element in this vector"<<'\n';
        } else {
            continue;
        }
    }