用于排序std :: set <std :: pair <int,std :: pair <int,int>&gt;&gt; </std :: pair <int,std :: pair <int,int>的比较函数

时间:2015-01-13 14:06:04

标签: c++ stl std-pair

我有这些结构:

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)) 

问题:是否可以按此排序方式创建集合?

3 个答案:

答案 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::setHere is a Q&A explaining how to do it