C++:结构与用于排序元素的函数
C++ : struct vs function for ordering elements
我有一个包含两个字段的struct
:
struct road {
int from, len ;
};
出于某种原因,我需要能够订购我的road
:
通过在数组中升
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
当然是road []
.
它编译完美(没有尝试运行它,但应该没问题),但是以两种完全不同的方式定义两个非常相似的比较器似乎很奇怪,所以有没有办法以相同的方式定义两种比较方法?
将cmpFrom
的定义更改为
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’
...
有没有办法使这些比较方法之一适用于两个容器?或者是否有第三种方法可以同时使用两者?
如果我需要对两个容器使用相同的顺序怎么办?这是否需要定义两次相同的比较方法,但struct
内有一个?
你几乎拥有它。 在std::sort
中,您需要一个可以调用operator()
的对象。 用
bool cmpFrom (const road & a, const road & b) {
return (a.from < b.from) ;
}
std::sort(trips, trips + nbRoads, &cmpFrom);
之所以有效,是因为函数指针可以像函数一样使用。 当您将cmpFrom
更改为
struct cmpFrom {
bool operator () (const road & a, const road & b){
return (a.from < b.from) ;
}
};
不能再使用std::sort(trips, trips + nbRoads, &cmpFrom);
,因为不能将&
应用于类型名称。 相反,你需要做的是获取一个cmpFrom
的对象,然后你这样做
std::sort(trips, trips + nbRoads, cmpFrom{});
现在priority_queue
和sort
都可以使用cmpFrom
.
将两者定义为结构更容易,因为您始终可以从类型创建对象,并且它将按预期运行,但是从函数获取类型并让它充当函数的调用者要困难得多。
事实上,你几乎和struct cmpFrom
在一起.但是,您已经正确注意到std::sort
需要比较器对象(例如函数),而不是类型。当然,在cmpFrom
类型&cmpFrom
是无效的C++。相反,您需要创建该类型的对象;由于定义了operator()
,该对象将是可调用的,并且可以执行您想要的操作。所以就这样称呼std::sort
:
std::sort(trips, trips + nbRoads, cmpFrom{});
std::sort
函数和std::priority_queue
类模板需要两个不同的东西:sort
想要一个可调用的对象,而priority_queue
模板需要一个允许创建对象的类型。
正因为如此,sort
比priority_queue
更杂食 - 您可以将其与函数或函子一起使用。您唯一需要的是为其提供一个真实的对象(而当前在您的代码中,您正在尝试获取一种类型的地址,这毫无意义)。
要在示例中修复它,只需将代码更改为
std::sort(trips, trips + nbRoads, cmpFrom{});
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用不带参数的函数访问结构元素
- 使用函数"remove"删除重复元素
- 如何将元素添加到数组的线程安全函数?
- 如何通过 getter 函数删除矢量的元素?
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 如何在基类指针向量的元素上应用重载的多态函数
- 这个返回元素位置的基于循环的函数有什么问题?
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 交换函数不是在 C++ 中交换 2D 数组的元素
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何在 c++ 中将整个数组初始化为类构造函数中的单个元素
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 使用并行参数向量调用元素向量的成员函数
- C 在双链接列表中删除元素函数
- 将类向量的两个函数返回值与其他类向量元素函数进行比较
- 访问c++中的列表元素函数