vector <pair <int,int>&gt; </pair <int,int>的比较器

时间:2014-06-15 11:37:08

标签: c++ vector stl comparator std-pair

vector<pair<int,int> > v;
for(i=0;i<5;i++){
    cin>>b>>c;
    v.push_back(make_pair(b,c));
}
sort(v.begin(),v.end());

是否可以为sort函数编写一个比较器,使v[i].first按递增顺序排序,对于v[i].first的类似值,v[i].second按降序排序?
如: -
i / p:

 13 10  
 44 15  
 13 15  
 13 99  
  6 45  

o / p:

 6 45  
 13 99  
 13 15  
 13 10  
 44 15 

2 个答案:

答案 0 :(得分:2)

当然,这很容易。

您需要做的就是使用此签名编写一个函数:

bool f(std::pair<int, int> lhs, std::pair<int, int> rhs);

当且仅当true

时,该函数应返回lhs < rhs

因此,根据您的条件,lhs小于rhs if:

  • lhs.first < rhs.first
  • lhs.first == rhs.first && lhs.second > rhs.second

所以,基本上只是把它们放在一起,你得到:

bool mycomparer(std::pair<int, int> lhs, std::pair<int, int> rhs) {
    if (lhs.first < rhs.first) {
        return true;
    }
    else if (lhs.first == rhs.first && lhs.second > rhs.second) {
        return true;
    }
    else {
        return false;
    }
}

这可以更紧凑地编写,但我希望保持简单和可读性以获得重点。 :)

答案 1 :(得分:2)

这是一个紧凑的比较函数对象,可以执行您想要的操作:(使用C ++ 11功能

struct Shivam {
    typedef std::pair<int, int> const& param_type;
    bool operator()(param_type lhs, param_type rhs) const {
        return std::tie(lhs.first, rhs.second) < std::tie(rhs.first, lhs.second);
    };
};

并像这样使用它:

std::sort(std::begin(v), std::end(v), Shivam{});