2013-02-17 29 views
0

如何查找矢量中元素的索引?假設矢量快照包含用迭代器查找元素的位置

10 12 15 23 43 

現在我想插入一個數字。

1-插件15 =>返回2(的位置)

2-插件50 =>的push_back()=>返回5(的位置)

但是,這是我寫的I可以不要將迭代器轉換爲整數。

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

vector<int> v; 
int insertVector(int a); 
int main() 
{ 
    int a; 
    cout << "enter number: "; 
    cin >> a; 
    int pos = insertVector(a); 
    cout << pos; // update 
    return 0;  
} 

int insertVector(int a) 
{ 
    vector<int>::iterator it; 
    it = find(v.begin(), v.end(), a); 
    if (it == v.end()) { 
     v.push_back(a); 
     return v.size(); 
    } 
    return it; // error 
} 

UPDATE:

如果我改變return it;return *it;,輸出是錯誤的。就像這樣:

enter number: 10 
1 
enter number: 20 
2 
enter number: 25 
3 
enter number: 35 
4 
enter number: 45 
5 
enter number: 5 
6 
enter number: 25 
25 // wrong 

回答

2

insertVector的返回類型爲int,但你可能會返回一個迭代器。你的代碼更改爲:

int insertVector(int a) 
{ 
    vector<int>::iterator it; 
    vector<int>::iterator begin = v.begin(); 
    it = find(begin, v.end(), a); 
    if (it == v.end()) { 
     v.push_back(a); 
     return v.size(); 
    } 
    return std::distance(begin, it); 
} 
+0

是的,我知道。我該如何解決這個問題。我想要 – mahmood 2013-02-17 07:43:23

1

您可以自己明確地迭代向量:(那麼優雅,但需要在矢量一個迭代)

int position = 0; 
for (it = v.begin(); it != v.end(); ++it; ++position) { 
    if (*it == a) { 
     return position; 
    } 
} 

v.push_back(a); 
return v.size() - 1; 
+0

示例中所述的數字是的,我知道這一點。我想從'algorithm'使用'find'。這將減少代碼行。如果沒有其他辦法,我會手動迭代 – mahmood 2013-02-17 07:49:24

+0

爲什麼不這樣做呢?正如你所看到的,在迭代器中沒有太多的魔力,所以你要麼寫一個更復雜的迭代器實現,要麼只是使用一個簡單的O(n)迭代。 – giorashc 2013-02-17 07:52:05