C ++:用于订购元素的struct vs函数

Nev*_* V. 6 c++ sorting struct priority-queue

我有struct两个领域:

struct road {
    int from, len ;
};
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我需要能够订购roads:

  • 通过升序from排列

  • 通过len在优先级队列中升序

因此,我包括:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
Run Code Online (Sandbox Code Playgroud)

我遇到过一些网站建议重载operator<,但是由于这两种可能的顺序感觉不对,只能解决这两种情况之一。

通过弄乱教科书,我可以使它起作用:

bool cmpFrom (const road & a, const road & b) {
    return (a.from < b.from) ;
}

struct cmpLen {
    bool operator () (const road & a, const road & b){
        return (a.len < b.len) ;
    }
};
Run Code Online (Sandbox Code Playgroud)

用于:

std::sort(trips, trips + nbRoads, &cmpFrom) ;
std::priority_queue<road, std::vector<road>, cmpLen> pickRoad ;
Run Code Online (Sandbox Code Playgroud)

trips当然是哪里了road []

它可以完美地编译(没有尝试运行它,但是应该没问题),但是用两种截然不同的方式定义两个非常相似的比较器似乎很奇怪,所以没有办法以相同的方式定义这两种比较方法吗?

将的定义更改cmpFrom

struct cmpFrom {
    bool operator () (const road & a, const road & b){
        return (a.from < b.from) ;
    }
};
Run Code Online (Sandbox Code Playgroud)

chantier.cpp: In function ‘int main()’:
chantier.cpp:38:48: error: expected primary-expression before ‘)’ token
     std::sort(trips, trips + nbRoads, &cmpFrom) ;
Run Code Online (Sandbox Code Playgroud)

我假定的意思是“当我期望参考时,您给了我一个类型”。

在写作时

bool cmpLen (const road & a, const road & b) {
    return (a.len <= b.len) ;
}
Run Code Online (Sandbox Code Playgroud)

chantier.cpp: In function ‘int main()’:
chantier.cpp:52:56: error: type/value mismatch at argument 3 in template parameter list for ‘template<class _Tp, class _Sequence, class _Compare> class std::priority_queue’
     std::priority_queue<road, std::vector<road>, cmpLen> pickRoad ;
                                                        ^
chantier.cpp:52:56: note:   expected a type, got ‘cmpLen’
chantier.cpp:56:30: error: request for member ‘top’ in ‘pickRoad’, which is of non-class type ‘int’
...
Run Code Online (Sandbox Code Playgroud)

有没有办法使这些比较方法之一对两个容器都起作用?还是有第三种方法可以同时适用于两者?

如果我需要对两个容器使用相同的顺序怎么办?是否需要定义两次相同的比较方法,但在其中包含一个struct

Rei*_*ica 5

将两者都定义为结构会更容易,因为您始终可以根据类型创建对象,并且对象将按预期方式工作,但是从函数中获取类型并将其用作函数的调用者要困难得多。

实际上,您几乎与struct cmpFrom。但是,您已经正确地指出,std::sort期望使用比较器对象(例如函数),而不是类型。当然,在&cmpFrom哪里做cmpFrom类型是无效的C ++。相反,您需要创建该类型的对象。多亏了已operator()定义的对象,该对象才可以调用并执行您想要的操作。所以就这样调用std::sort

std::sort(trips, trips + nbRoads, cmpFrom{});
Run Code Online (Sandbox Code Playgroud)


Nat*_*ica 5

您几乎拥有它。在其中std::sort您需要一个可以调用的对象operator()。使用

bool cmpFrom (const road & a, const road & b) {
    return (a.from < b.from) ;
}
std::sort(trips, trips + nbRoads, &cmpFrom);
Run Code Online (Sandbox Code Playgroud)

之所以起作用,是因为函数指针可以像函数一样使用。当您更改cmpFrom

struct cmpFrom {
    bool operator () (const road & a, const road & b){
        return (a.from < b.from) ;
    }
};
Run Code Online (Sandbox Code Playgroud)

您不能再使用std::sort(trips, trips + nbRoads, &cmpFrom);,因为您不能应用&到类型名称。相反,您需要做的是获取一个对象,cmpFrom然后像

std::sort(trips, trips + nbRoads, cmpFrom{});
Run Code Online (Sandbox Code Playgroud)

现在priority_queuesort都可以使用cmpFrom