C++ 如何更改对(>;和<;)运算符的行为?

C++ 如何更改对(>;和<;)运算符的行为?,c++,operator-overloading,std-pair,C++,Operator Overloading,Std Pair,我试图对一个向量进行排序,但我想更改pair类型的比较运算符的行为,这样,如果第一个值相等,并且它是一个comparing with(>)运算符,我希望它将第二个值与(这是通过将自定义比较器函数传递到sort来完成的。使用lambda最容易做到这一点,如下所示: sort( vp.begin(), vp.end(), [](const pair<int,char>& lhs, const pair<int,char>& rhs) -

我试图对一个
向量
进行排序,但我想更改pair类型的比较运算符的行为,这样,如果第一个值相等,并且它是一个comparing with(>)运算符,我希望它将第二个值与(这是通过将自定义比较器函数传递到
sort
来完成的。使用lambda最容易做到这一点,如下所示:

sort(
    vp.begin(),
    vp.end(),
    [](const pair<int,char>& lhs, const pair<int,char>& rhs) -> bool {
        return lhs.first != rhs.first 
            ? lhs.first < rhs.first 
            : lhs.second < rhs.second;
    }
);
排序(
vp.begin(),
vp.end(),
[](常数对和左侧、常数对和右侧)->bool{
返回左首!=右首
?左首<右首
:左秒<右秒;
}
);

此代码先按升序
排序,然后再按升序
排序,但您可以调整两个比较的优先级和方向,以按您想要的方式进行排序。

只需提供您自己的比较功能:

bool comp(const std::pair<int, char>& a, const std::pair<int, char>& b)
{
  if (a.first > b.first) {
    return true;
  } else if (a.first == b.first && a.second < b.second) {
    return true;
  }
  return false;
}
我试图对向量进行排序,但我想更改比较的行为

只需定义一个合适的二进制谓词函数,并将其作为第三个参数传递给
std::sort

bool-foo(常量对和左侧、常量对和右侧)
{
//在这里实现逻辑
}
....
排序(vp.begin(),vp.end(),foo);

您不应该在这里重载运算符。您应该实现一个自定义比较函数,并将其传递给
std::find
或在排序后简单地反转向量。
lhs.first
应该是
lhs.first>rhs.first
-询问者希望按对中的第一个元素降序。@sftrabbit:Was不要试图确定确切的排序;很容易看出如何更改。不过添加了一个说明,谢谢。谢谢你的回答,我知道你的代码理论上应该运行得更快,因为使用了简单的if语句,但我选择@sftrabbit代码是为了让任何人都更容易阅读,再次感谢:)。
sort(
    vp.begin(),
    vp.end(),
    [](const pair<int,char>& lhs, const pair<int,char>& rhs) -> bool {
        return lhs.first != rhs.first 
            ? lhs.first < rhs.first 
            : lhs.second < rhs.second;
    }
);
bool comp(const std::pair<int, char>& a, const std::pair<int, char>& b)
{
  if (a.first > b.first) {
    return true;
  } else if (a.first == b.first && a.second < b.second) {
    return true;
  }
  return false;
}
sort(vp.begin(),vp.end(), comp);
bool foo(const pair<int,char>& lhs, const pair<int,char>& rhs)
{
  // implement logic here
}

....

sort(vp.begin(),vp.end(), foo);