首页 > 解决方案 > C ++:用于排序元素的结构与函数

问题描述

我有struct两个字段:

struct road {
    int from, len ;
};

出于某种原因,我需要能够订购我road的 s :

因此,我包括:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>

我遇到过建议重载的网站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) ;
    }
};

用于:

std::sort(trips, trips + nbRoads, &cmpFrom) ;
std::priority_queue<road, std::vector<road>, cmpLen> pickRoad ;

tripsa 当然在哪里road []

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

更改cmpFromto的定义

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

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

我认为这意味着“当我期待参考时,你给了我一个类型”。

写的时候

bool cmpLen (const road & a, const road & b) {
    return (a.len <= b.len) ;
}

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’
...

有没有办法使这些比较方法中的一种适用于两个容器?或者是否有第三种方法可以同时使用这两种方法?

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

标签: c++sortingstructpriority-queue

解决方案


将两者都定义为结构更容易,因为您始终可以从一个类型创建一个对象并且它会按预期运行,但是从一个函数中获取一个类型并让它充当函数的调用者要困难得多。

事实上,你几乎在那里struct cmpFrom。但是,您已经正确地注意到std::sort需要比较器对象(例如函数),而不是类型。当然,做&cmpFromwhere cmpFromis a type 不是有效的 C++。相反,您需要创建该类型的对象;由于已operator()定义,该对象将是可调用的并可以执行您想要的操作。所以只需std::sort像这样调用:

std::sort(trips, trips + nbRoads, cmpFrom{});

推荐阅读