c++ - C ++:用于排序元素的结构与函数
问题描述
我有struct
两个字段:
struct road {
int from, len ;
};
出于某种原因,我需要能够订购我road
的 s :
from
通过在数组中升序len
通过在优先级队列中上升
因此,我包括:
#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 ;
trips
a 当然在哪里road []
。
它编译完美(没有尝试运行它,但应该没问题),但是以两种完全不同的方式定义两个非常相似的比较器似乎很奇怪,所以没有办法以相同的方式定义两种比较方法吗?
更改cmpFrom
to的定义
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
?
解决方案
将两者都定义为结构更容易,因为您始终可以从一个类型创建一个对象并且它会按预期运行,但是从一个函数中获取一个类型并让它充当函数的调用者要困难得多。
事实上,你几乎在那里struct cmpFrom
。但是,您已经正确地注意到std::sort
需要比较器对象(例如函数),而不是类型。当然,做&cmpFrom
where cmpFrom
is a type 不是有效的 C++。相反,您需要创建该类型的对象;由于已operator()
定义,该对象将是可调用的并可以执行您想要的操作。所以只需std::sort
像这样调用:
std::sort(trips, trips + nbRoads, cmpFrom{});
推荐阅读
- php - 在 RESTful API 中,如何使用 PHP 验证公钥和密钥?
- php - PHP连接访问数据库插入值和组合框值
- php - 如何在 MYSQL 中将数据添加到 POINT 数据类型?
- javascript - 赛普拉斯应找到元素:'.checkbox_0.0',但从未找到它
- sql - 是否可以在不知道要排序的任何字段的情况下每次选择不同的行?
- r - 应用 rsample 包中的 rolling_origin 函数后取消嵌套深度列表
- python - Seaborn:如何用数字值临时替换列中的非数字值以进行分配?
- android - 无法弄清楚androidX和Jetpack的层次结构
- javascript - 无法获取 Javascript 设置的输入值,然后通过 Blazor 按钮单击读取
- java - Spring:为什么注入的bean的公共字段仅在依赖bean中为空?