c++中一个结构的qsort
qsort of a structure in c++
我试图对结构进行排序,但出现了以下错误:
error: cannot convert ‘std::vector<Node>’ to ‘void*’ for argument ‘1’ to ‘void qsort(void*, size_t, size_t, __compar_fn_t)’
qsort(nodes,nodes.size(), sizeof(Node), dataClustering::compare);
这是我的代码:比较功能:
int compare(const void * node1, const void * node2){
string name1 = ((const struct Node*)node1)->name;
string name2 = ((const struct Node*)node2)->name;
int start1 = ((const struct Node*)node1)->start;
int start2 = ((const struct Node*)node2)->start;
if(name1 <= name2 && start1 <= start2){
return -1;
}
else if(name1 > name2 && start1 > start2){
return 1;
}
else{
return 0;
}
}
调用另一个函数中的比较:
qsort(allNodes,allNodes.size(), sizeof(Node), compare);
hpp文件中的头(我试图将其放在静态中,但这并不能解决错误):
int compare(struct Node *, struct Node *);
您可以将向量传递给C样式排序,例如:
qsort(&allNodes[0], allNodes.size(), sizeof(Node), compare);
您最好使用std::sort
,它本身就可以处理向量:
bool compareNodes(const Node& lhs, const Node& rhs) {
return (lhs.name < rhs.name)
|| (lhs.name == rhs.name && lhs.start < rhs.start);
}
...
std::sort(allNodes.begin(), allNodes.end(), compareNodes);
在C++11/C++14中,您也可以将比较定义为lambda:
std::sort(allNodes.begin(), allNodes.end(), [] (const auto& lhs, const auto& rhs) {
return (lhs.name < rhs.name)
|| (lhs.name == rhs.name && lhs.start < rhs.start);
});
(上面的代码使用auto
作为lambda参数,这是C++14的一个特性)。
错误是您
cannot convert ‘std::vector<Node>’ to ‘void*’
因此,std::vector<Node>
不可能是像具有签名的qsort
这样的函数的合适的第一自变量
void (void*, size_t, size_t, __compar_fn_t)
虽然您可以在这里使用qsort
,但实际上不应该:您应该使用C++标准库中的std::sort
:
using std::sort;
sort(begin(allNodes), end(allNodes), compare_function);
这里,compare_function
应该是一个类似于<
的函数,它接受两个适当类型的参数(例如,您正在排序的对象的实际类型或const
对它们的引用,而不是指向它们的指针或void
指针),如果第一个参数小于第二个参数,则返回bool
。(compare_function
实际上不一定是一个函数:它也可以是任何具有适当operator()
或lambda的对象)
如果只想排序,请使用
#include <algorithm>
...
bool myfunction (const Node &lhs, const Node &lhs) {
if(lhs.name < rhs.name) return true;
return (lhs.name == rhs.name && lhs.start < rhs.start));
}
...
std::sort(allNodes.begin(), allNodes.end(), compare_func);
进一步阅读:std::sort
如果您想使用cstyle=qsort
(我建议您不要使用),请添加包装器函数以将void *
转换为Node *
,并将qsort
的第一个参数更改为static_cast<void *>(&allNodes[0])
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何将数据从一个结构链接到另一个结构
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- std::transform 将一个结构数组复制到另一个结构数组
- 输入 ctrl + x 后如何再次 cin (cin<<x) 循环(cin 一个结构)
- 如何在级别上打印树,给定一个结构,该结构保存节点的值及其父节点的值,对于树中的每个节点
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- 如何在另一个结构中初始化结构数组?
- 在另一个结构中声明内部结构会导致错误:结构使用无效
- 我想重置一个C++结构统计,我可以以某种方式使用 stat() 语法吗?
- C++可以输出一个结构的内存地址吗
- 通过 C++ 中的另一个结构成员访问结构
- C++ push_back() 一个结构体到一个向量中
- 难以从另一个结构中的函数返回结构
- 如何将向量添加到结构中以创建一个库存系统,在该系统中,我可以仅使用一个结构向系统添加多种不同的葡萄酒
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 将一个结构的值复制到另一个结构
- 是否可以在同一未创建的结构内创建一个结构