2008-10-08 51 views
17

即時通訊嘗試使用STL查找算法(和min_element算法)找到向量中最小值的位置,但不是返回該位置,而是僅給出該值。例如,如果最小值是它,位置將被返回爲8等。我在這裏做錯了什麼?使用STL的向量中的位置

int value = *min_element(v2.begin(), v2.end()); 
cout << "min value at position " << *find(v2.begin(), v2.end(), value); 
+0

有一個在你的問題一個錯字:你說你想要找的* vector中的最大*值,而您顯然正在嘗試查找* minimum *值。 – 2008-10-08 14:13:50

回答

34

min_element已經給你一個迭代器,不需要調用find(另外,這是低效的,因爲它是工作的兩倍)。使用distance-操作:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin(); 
+0

我用名單試了一下,把我的腦袋關掉!爲什麼? – prakharsingh95 2014-09-02 14:50:52

+3

@ prakharsingh95因爲你正在使用大寫鎖定(因爲你沒有仔細閱讀我的答案 - 嘗試`std :: distance`)。 – 2014-09-02 15:46:49

15

你使用回迭代器這兩種算法。如果取消引用一個迭代器,你這是「尖」通過這個迭代的對象,這就是爲什麼你打印而不是位置

cout << "min value at position " << *find(v2.begin(), v2.end(), value); 

的迭代器時可以被視爲一個指針(呃,不完全是,但爲了簡單起見我們這麼說);因此,迭代器本身不能給你在容器中的位置。既然你遍歷一個向量,就可以使用減號運算符,如康拉德說:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin(); 

但我會建議使用的std ::距離算法,這是更爲靈活,將工作在所有標準容器:

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end())); 
7

簡短的回答,你認爲你有問「我如何確定std::vector<>位置給出從它的迭代器?」是功能std::distance

什麼你大概的意思做,然而,得到的迭代器,你提領它獲得的價值:

using namespace std; 
vector<int>::const_iterator it = min_element(v2.begin(), v2.end()); 
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it;