2013-02-05 39 views
2

我使用C++和我有2個矢量,一個彼此相關:C++爲MAX的搜索矢量,並獲得相同的位置形成第二矢量

vector<double> val = {.3,.5,.2,.4}; 
vector<string> str = {'a','b','c','d'}; 

我想搜索VAL爲最大,然後從STR在相同的位置返回字符串:

vector<double>::const_iterator it; 
it = max_element(val.begin(), val.end()); 

所以,我怎麼能使用itstr把信?

string lettter; 
letter = str.at(it-> ?????); 

謝謝!

回答

3

你可以找到it多遠是從val開始,然後使用該索引str

str[std::distance(std::begin(val), it)] 

通過使用std::distance,如果你改變val類型的容器,其迭代器,這將仍然有效不提供隨機存取。但是,在隨機訪問迭代器上使用它時,仍然會保持時間複雜度不變。使用std::begin允許您更改val到C風格的數組,如果你曾經想。

值得一提的是,你應該初始化str有:

vector<string> str = {"a","b","c","d"}; 

std::string沒有構造函數一個char

+0

我看到一個錯誤,說「沒有函數模板std :: distance的實例匹配參數列表」------我試過'str [std :: distance(std :: begin(val),* it)] '同樣的東西 – KevinCameron1337

+0

@ Special - k我認爲你的問題是'it'是'const_iterator',而'std :: begin'則給出'iterator'。不幸的是,沒有'std :: cbegin'(標準中的疏忽)。你可以使'it'成爲'iterator'或者自己實現'cbegin'。或者你可以使用'val.cbegin()'而不是'std :: begin(val)'。 –

2

獲取元素的索引像這樣:

auto index = std::distance(val.begin(), it); 

然後索引到您的字符串數組:

auto letter = str[index]; 

需要注意的是,如果這些值是相關的,你應該強制保持在一起:

typedef std::pair<double, string> valstr_pair; 
std::vector<valstr_pair> valstr; 

auto it = std::max_element(valstr.begin(), valstr.end(), 
    [](const valstr_pair& first, const valstr_pair& second) 
    { 
     return first.first < second.first; // compare values 
    }); 

it->first; // max value 
it->second; // string of max value 
+0

它是一個好主意,但我會然後只是使用地圖。問題是我的應用程序在不同的時間填滿了我的向量。這在我上面的簡單例子中並不明顯。所以,因爲當時的字符串(文件名)插入到他們的載體,我不能保持值加在一起,雙打(得分函數)沒有被運行。我想我可以插入具有全0的文件名,然後就一度將比分計算更新它們。 – KevinCameron1337

2

這會給你的max_element()返回的迭代器和載體的開始之間的距離:

std::distance(val.begin(), it)

然後,您可以使用它作爲一個索引str

4

如何

letter = str.at(it - val.begin()); 

(Rationale)

+0

我認爲'std :: distance'稍好,因爲它可以與列表和其他容器一起工作。你鏈接的基本原理並不適用於這裏,因爲'max_element'已經是O(n),所以增加另一個可能的O(n)操作並不重要。 – interjay

+0

爲什麼不接受? :( – 2013-02-05 20:21:17

+0

很多好的答案,我結束了與距離()的答案。所以這似乎是公平的點頭答覆,希望我能接受2 :) – KevinCameron1337