2014-09-11 77 views
2

我有一個std :: multiset,它存儲std :: pair。我希望第一個屬性對唯一性沒有限制,但我希望第二個屬性是唯一的。所以,我決定把我自己的功能傳遞給multiset,以實現這一點(如果不是,請讓我知道)。將我的compar函數傳遞給std :: multiset與C++ 11

基於this答案,我寫了一個類似的函數,但它失敗了,我不知道爲什麼(不知道λ - 我是希臘語:))。

auto f = [](std::pair<float, int>& a, std::pair<float, int>& b) { 
    return (a.first < b.first && a.second != b.second); 
}; 

錯誤:

error: expression ‘#‘lambda_expr’ not supported by dump_expr#<expression error>’ is not a constant-expression 
sorry, unimplemented: non-static data member initializers 
error: unable to deduce ‘auto’ from ‘<expression error>’ 
+0

這意味着,我在錯誤的軌道上@TC 。 我該怎麼辦? – gsamaras 2014-09-11 01:06:04

+0

我不明白你的獨特性標準。你正在使用'multiset',所以比較相同的多個鍵將被存儲在容器中。 – Praetorian 2014-09-11 01:14:41

+1

我認爲主要問題是lambda需要採用'const&'或值 – 2014-09-11 01:19:33

回答

3

我認爲你不能傳遞一個lambda(運行時結構)作爲模板參數(編譯時構造)。使用結構與operator()可代替:

#include <set> 
struct my_compare { 
    bool operator() (const std::pair<float, int>& a, const std::pair<float, int>& b) { 
    return (a.first < b.first && a.second != b.second); 
    }; 
}; 
int main(int argc, char ** argv) { 
    std::multiset<std::pair<float, int>, my_compare> set; 
    return 0; 
} 

或者,是lambda和decltype(如禁衛軍的答案):

#include <set> 
int main(int argc, char ** argv) { 
    auto my_compare = [](const std::pair<float, int>& a, const std::pair<float, int>& b) { 
    return (a.first < b.first && a.second != b.second); 
    }; 
    std::multiset<std::pair<float, int>, decltype(my_compare)> set(my_compare); 
    return 0; 
} 
+0

我在GCC 4.9上發現了一個與你所看到的不同的錯誤:temp。cpp:13:40:error:模板類型參數的模板參數必須是類型。 – Zach 2014-09-11 01:12:10

+0

我提供的鏈接中的那個人建議用λ。添加'set.insert(std :: make_pair(0.1,1));'看看它發生了什麼。 @ T.C發表了評論。說multiset需要強烈的排序,我們的比較沒有! – gsamaras 2014-09-11 01:17:31

+0

顯然,insert()調用失敗的原因是編譯器不滿意參數不是const。我會更新我的答案。 – Zach 2014-09-11 01:21:43

5

由於您使用的是multiset,而不是set,多比較相等的鍵仍然會存儲在容器中,所以當你談論唯一性時,我不確定你的意思。

假設你的意思,你只需要在pair第二因素影響排序,你可以使用lambda如下:

auto f = [](std::pair<float, int> const& a, std::pair<float, int> const& b) { 
    return a.second < b.second; 
}; 
std::multiset<std::pair<float, int>, decltype(f)> m(f); 

Live demo

+0

謝謝,我會接受其他答案,因爲它是第一個公平競爭。 :) – gsamaras 2014-09-11 01:28:15

+1

@ G.Samaras你接受最好的答案,這裏沒有公平競爭的問題。我們不玩遊戲。那些用SO來獲得聲譽而不是知識的人是愚蠢的。 – 101010 2014-09-11 13:15:29

+0

好點@ 40two。我仍然保留其他答案,因爲那是第一次。 :) – gsamaras 2014-09-11 13:32:24