我试图在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
的类型为字符串!
答案 0 :(得分:153)
要知道指向元素的迭代器,在向量中获取元素的位置,只需从迭代器中减去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_));
答案 1 :(得分:88)
如果您想要索引,可以将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);
}
答案 2 :(得分:0)
没有人提到通用版本是任何std::vector<T>
的函数,所以这里是(丑陋的一行):
#include <algorithm>
template <typename T> long long int indexOf(const std::vector<T> &vector , const T &data){
return (std::find(vector.begin(), vector.end(), data) != vector.end()) //Is it in the vector ?
?
std::distance(vector.begin(), std::find(vector.begin(), vector.end(), data)) //Yes, take the distance (C++11 and above, see the previous answers)
: -1; //No, return -1
}
并且没有三元运算符:
#include <algorithm>
template <typename T> long long int indexOf(const std::vector<T> &vector , const T &data){
if((std::find(vector.begin(), vector.end(), data) != vector.end())){
return std::distance(vector.begin(), std::find(vector.begin(), vector.end(), data));
}
else{return -1;}
}
如果元素不在向量中,则返回索引或-1。
请注意,对于大向量来说,这可能非常慢,因为它计算的次数是std::find
的两倍。
答案 3 :(得分:-1)
我是初学者,所以这是初学者的答案。 for循环中的if给出i,然后可以使用 但是需要另一个向量中的Numbers [i]。 多数是为了举例说明的绒毛,for / if确实说明了一切。
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;
}
}