2013-02-26 50 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