我尝试对结构进行排序,但出现此错误:
\n\n error: cannot convert \xe2\x80\x98std::vector<Node>\xe2\x80\x99 to \xe2\x80\x98void*\xe2\x80\x99 for argument \xe2\x80\x981\xe2\x80\x99 to \xe2\x80\x98void qsort(void*, size_t, size_t, __compar_fn_t)\xe2\x80\x99\n qsort(nodes,nodes.size(), sizeof(Node), dataClustering::compare);\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的代码:\n比较函数:
\n\nint compare(const void * node1, const void * node2){\n string name1 = ((const struct Node*)node1)->name;\n string name2 = ((const struct Node*)node2)->name;\n int start1 = ((const struct Node*)node1)->start;\n int start2 = ((const struct Node*)node2)->start;\n\n if(name1 <= name2 && start1 <= start2){\n return -1;\n }\n else if(name1 > name2 && start1 > start2){\n return 1;\n }\n else{\n return 0;\n } \n}\nRun Code Online (Sandbox Code Playgroud)\n\n在另一个函数中调用比较:
\n\nqsort(allNodes,allNodes.size(), sizeof(Node), compare);\nRun Code Online (Sandbox Code Playgroud)\n\n以及 .hpp 文件中的标头(我尝试将其放入静态但这并不能解决错误):
\n\nint compare(struct Node *, struct Node *);\nRun Code Online (Sandbox Code Playgroud)\n
例如,您可以将向量传递给 C 风格排序,如下所示:
qsort(&allNodes[0], allNodes.size(), sizeof(Node), compare);
Run Code Online (Sandbox Code Playgroud)
你最好使用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);
Run Code Online (Sandbox Code Playgroud)
在 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);
});
Run Code Online (Sandbox Code Playgroud)
(上面的代码使用autolambda 参数,这是一个 C++14 功能)。