正如标题所说,我已经构建了set
pair
double value
个值,我需要set<pair<unsigned int, double> > s
(第二个)订购:
{{1}}
答案 0 :(得分:10)
你应该使用比较器:
struct Cmp
{
bool operator ()(const pair<unsigned int, double> &a, const pair<unsigned int, double> &b)
{
return a.second < b.second;
}
};
然后您可以定义您的设置:
set <pair<unsigned int, double>, Cmp> your_set;
答案 1 :(得分:2)
set
有三个参数,其中最后两个是可选的。但在你的情况下,你想使用第二个参数,它告诉你如何对元素进行排序。默认情况下(忽略第三个参数),set
为:
set<typename Key, typename Compare = less<Key>>
您只需要为第二个参数编写适当的类,例如:
template<typename Pair>
class CompareSecond
{
bool operator()(const Pair& firstPair, const Pair& secondPair)
{
return firstPair.second < secondPair.second;
}
}
然后你将set
构建为:
typedef pair<unsigned int, double> MyPair;
set<MyPair, CompareSecond<MyPair>> s;
答案 2 :(得分:1)
在C ++ 11中,您可能希望使用lambda。不幸的是,不可能在未评估的上下文中获得lambda的类型。因此,我们需要作弊以获得参数推论:
#include <set>
template<typename T, typename Cmp>
std::set< T, Cmp > make_set(Cmp cmp) {
return std::set<T, Cmp>(cmp);
}
int main()
{
auto s = make_set<std::pair<int, int> >(
[](const std::pair<int, int>& p1, const std::pair<int, int>& p2)
{ return p1.second < p2.second; } );
return 0;
}
make_set
是一个很好的算子,但如果你不能使用它
需要为set
指定分配器。
答案 3 :(得分:0)
您可以使用地图而不是设置。使用键double和值unsigned int。 std :: map&lt; doublely,unsigned int&gt; S;