2014-07-08 133 views
0

這是一個初學者的問題 - 我沒有用C++的標準庫工作太多。如何從一對矢量中提取第二個元素?

我有一個向量,其中包含我創建的元素對使用make_pair。接下來,我對向量中的元素進行了排序。現在,我想從存儲在向量中的每一對中提取第二個元素。我知道我可以在標準庫中使用for_each函數,但只允許您指定lambda函數。 如何提取第二個元素,以便將其放入單獨的OpenCV Mat?請幫助:)

編輯 我寫了一個小for_each功能,這需要在向量進行排序,遍歷向量對於每一對,並輸出到cmd每對中的元素。相反,我想在矢量上使用for循環,提取每一對,並提取第二個元素。 :)

typedef std::pair<float, int> value; 

vector2Sort.push_back(std::make_pair(Matches.col(c).at<float>(r),r)); 

std::sort(vector2Sort.begin(), vector2Sort.end(), 
    [&](const value& v1, const value& v2) 
     { 
     return v1.first < v2.first; 
     }); 

std::for_each(vector2Sort.begin(), 
    vector2Sort.end(),[&](const vector2Sort& v) 
{ 
// TODO: put second element in OpenCV Mat 
// display output 
std::cout << v.second << ": " << static_cast<int>(v.first) << std::endl; 
}); 
+6

「提取」是什麼意思?元素就在那裏,隨你便。 –

+2

不確定「提取」是什麼意思,但是要得到第二個元素,它就是它的聲音:'v.second'。 – Jashaszun

+2

'for_each'是一個函數,而不是一個類。 – chris

回答

0

如果我理解正確的話,你可以提取與第二要素:

template<class T1, class T2> 
static void extract_second(const vector<pair<T1, T2> >& v, vector<T2>& v2) { 
    v2.resize(v.size()); 
    for (size_t i = 0; i < v.size(); i++) { 
     v2[i] = v[i].second; 
    } 
} 

如果你想要做用外的λ值的λ內側的第二元素的東西,因爲你可以通過參考[&]獲得上下文中的所有內容,例如你可以做:

vector<float> snds; 
std::for_each(vector2Sort.begin(), 
    vector2Sort.end(),[&](const vector2Sort& v) 
{ 
    snds.push_back(v.second); 
    // display output 
    std::cout << v.second << ": " << static_cast<int>(v.first) << std::endl; 
}); 

這是你在問什麼?

+0

啊,拍。我沒有想到像使用for循環一樣。我明白我現在可以做到。謝謝! :) – Eagle

+0

np。順便說一下,在'sort'行中,可以省略自定義比較運算符,因爲默認情況下,std :: pair 與第一個組件T1(按升序)進行比較。如果你在T1中有兩個元素的關係,排序將在T2上進行比較。 – tinlyx

+3

使用transform對於這個特定的工作似乎是一個更合適的工具:'std :: transform(v。begin(),v.end(),std :: back_inserter(dst),[](auto p){return p.second; });' –

相關問題