【问题标题】:Sorting vector of pairs with int and Points使用 int 和 Points 对向量进行排序
【发布时间】:2019-10-11 07:44:12
【问题描述】:

我在对向量进行排序时遇到问题。我想根据第一个元素(即数字)对向量进行排序。谁能解释我做错了什么以及这 2 个错误意味着什么?

我尝试使用比较功能对它进行排序,没有它,没有任何效果。

struct Point{
    int x;
    int y;
};

bool compare(int a,int b){
     return a < b;
}

int main()
{
int N,Number,x,y;

cin >> N;
vector<pair<int,Point>> p;
for(int i = 0 ; i < N ; i++){
    cin >> Number >> x >> y;
    pair<int,Point> pom = {Number,{x,y}};
    p.push_back(pom);
    }
//    sort(p.begin(),p.end());
//    sort(p.begin().p.end(),compare);
return 0;
}

我有两个错误,但我不知道是什么意思:
1.'operator || (!(__y.first 2. constexpr 函数体 'constexpr bool std::operator&, const std::pair<_t1 _t2>&) [with _T1 = int; _T2 = Point]' 不是返回语句
|| (!(__y.first

【问题讨论】:

  • 你不需要ints 的比较器,这已经在语言中提供了。编译器不知道的是如何比较Point 类的两个实例。或std::pair&lt;int, Point&gt; 的比较器,如果您希望仅在std::sort 函数中使用它(而不是提供operator&lt;(Point, Point) 供所有人使用)
  • Points 没有实现比较运算符,因为没有定义如何比较 Points。
  • 另外,您可能希望您的比较运算符返回一个 int,而不是一个布尔值。这不是等于操作或小于操作。如果 a b,则 > 0。
  • @JosephLarson 如果要在std::sort 中使用此函数,则如果元素a 应该在元素b 之前,则预计返回true,否则返回false
  • 啊。我应该检查一下。

标签: c++ sorting vector std-pair


【解决方案1】:

ints 的比较器没用,可能是未定义的行为。编译器知道如何比较两个整数,它是语言的一部分。它还知道如何比较std::pair 的两个实例。它不知道的是如何比较Point类的两个实例,这是你定义的。

基本上,您有两种选择:

1.为Point提供operator&lt;

这将使您在以后的任何情况下都可以轻松比较两点:

bool operator<(const Point& p1, const Point& p2) {
    if (p1.x == p2.x) 
    {
        return p1.y < p2.y;
    }
    return p1.x < p2.x;
}    

2。为std::sort 提供就地比较器 如果您只需要比较物品以进行排序,这是一个快速的解决方案。

std::sort(p.begin(), p.end(), [](const auto& p1, const auto& p2) {
    //whatever logic it takes to compare two std::pair<int, Point>
});

注意: 通用 lambda(以 const auto&amp; 作为参数)是 C++14 功能。 Lambda 本身就是 C++11 特性。

以上选择取决于使用情况。如果您只需要对向量进行排序,或者排序逻辑异常,请使用std::sort 比较器。如果您想始终以相同的方式比较两个 Points,请使用运算符重载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2017-12-05
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多