如何在字符串向量中获取某个元素的位置,将其用作ints向量中的索引?

时间:2013-02-26 21:32:52

标签: c++

我试图在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的类型为字符串!

4 个答案:

答案 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::findstd::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;
        }
    }