我有这些结构:
typedef std::pair<unsigned int, std::pair<int, int> > myPair;
typedef std::set< myPair> Graph;
Graph g;
对图表进行排序的正确比较函数是什么?
std::sort(g.begin(), g.end(), Cmp());
我尝试过这样的事情:
struct Cmp{
bool operator()(const myPair& l, const myPair& r)const{
return l.second.second < r.second.second;
}
};
我希望根据最内层对的第二个元素对该集进行排序。有可能吗?
a = (std::make_pair(0,std::make_pair(1,1)));
b = (std::make_pair(0,std::make_pair(1,2)));
c = (std::make_pair(0,std::make_pair(1,0)));
d = (std::make_pair(1,std::make_pair(2,0)));
结果将是:
在订购之前
c = (0,(1,0)), a = (0,(1,1)), b = (0,(1,2)), d = (1,(2,0)
订购后
c = (0,(1,0)), d = (1,(2,0), a = (0,(1,1)), b = (0,(1,2))
问题:是否可以按此排序方式创建集合?
答案 0 :(得分:0)
您无法在std::sort
上致电std::set
,但可以使用谓词构建set
。
typedef std::set<myPair, Cmp> Graph;
答案 1 :(得分:0)
您需要另一个set
使用不同的谓词。您无法更改现有set
的排序算法。
答案 2 :(得分:0)
您的比较功能是一个良好的开端。缺少的是“领带决议”。您需要指定l.second.second == r.second.second
时发生的情况,以及l.second.first == r.second.first
时发生的情况:
bool operator()(const myPair& l, const myPair& r)const{
return (l.second.second < r.second.second) ||
((l.second.second == r.second.second) && (l.second.first < r.second.first)) ||
((l.second.second == r.second.second) && (l.second.first == r.second.first) && (l.first < r.first)).
}
要使用此功能对您的集进行排序,您需要将其作为第二个模板参数传递给std::set
。 Here is a Q&A explaining how to do it