2013-02-26 48 views
64

我想要得到一个向量strings中的一个元素的索引,将它用作另一个向量int类型的索引,这可能吗?如何获取字符串向量中某个元素的位置,将其用作ints向量中的索引?

例子:

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

我想这应该http://stackoverflow.com/questions/1425349/how-do- i-find-an-element-position-in-stdvector – 2013-02-26 21:52:37

+0

你应该检查出std :: map或std :: unordered_map。 – Etherealone 2013-02-26 21:56:43

回答

118

获得元素的位置的矢量知道指向元素的迭代器,只需从迭代器中减去v.begin()

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

现在你需要检查posNames.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_)); 
+0

对不起,我看不到@Bob__的评论,可能会被删除?我想知道为什么'ptrdiff_t'比'size_t'更好,因为'ptrdiff_t'会引发有符号和无符号整数比较的警告 – Hiraku 2017-10-17 05:43:35

+1

@Hiraku他没有删除他的评论。他建议使用'ptrdiff_t',因为它允许您将任意一对迭代器之间的距离存储到同一个容器中,即使在结果为负数的情况下也是如此。如果我们使用'size_t',我们必须小心不要从较小的迭代器中减去一个更大的迭代器。 – dasblinkenlight 2017-10-17 10:49:17

69

如果您需要索引,可以使用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); 
} 
+3

为什么不使用const迭代器? – dani 2016-02-13 09:33:42