如何得到某个元素在字符串向量中的位置,并将其作为整型向量的索引?

我试图得到一个元素的索引在一个向量的 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_nameNames向量中的位置,用它来访问 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是字符串类型的!

217511 次浏览

If you want an index, you can use std::find in combination with 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);
}

To get a position of an element in a vector knowing an iterator pointing to the element, simply subtract v.begin() from the iterator:

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

Now you need to check pos against Names.size() to see if it is out of bounds or not:

if(pos >= Names.size()) {
//old_name_ not found
}

vector iterators behave in ways similar to array pointers; most of what you know about pointer arithmetic can be applied to vector iterators as well.

Starting with C++11 you can use std::distance in place of subtraction for both iterators and pointers:

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

I am a beginner so here is a beginners answer. The if in the for loop gives i which can then be used however needed such as Numbers[i] in another vector. Most is fluff for examples sake, the for/if really says it all.

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

I'm pretty sure pointer arithmetic applies the same way here as in arrays.

int getVecPos(std::vector<string> vec, string element){
int i;
for(i = 0; i < vec.size(); i++){
if(vec[i] == element){
break;
}
}
if(i == vec.size()){
std::cout<<"No such element as "<<element<<" found. Please enter again: ";
std::cin>>element;
i = getVecPos(vec, element);
}
        

return i;
}

You can add it to the vec.begin() to get an iterator that you can use for the other vector functions or you can use for finding the index of an element in the array. Example:-

int getVecPos(std::vector<string>, string);//This was the function from earlier.
std::vector<string> UpdateHealables(std::vector<string> healables, string healing_item){
auto it = healables.begin() + getVecPos(healables, healing_item);
healables.erase(it);
return healables;
}