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文件中的header(我试着把它放在static中,但这并不能解决错误):
int compare(struct Node *, struct Node *);
如果你只想排序,使用
#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])
错误是你
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
指针)和 returns bool
如果第一个参数小于第二个参数。 (compare_function
实际上不一定是函数:它也可以是任何具有适当 operator()
或 lambda 的对象)
您可以将向量传递给 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 特性)。
我尝试对结构进行排序,但出现此错误:
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文件中的header(我试着把它放在static中,但这并不能解决错误):
int compare(struct Node *, struct Node *);
如果你只想排序,使用
#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])
错误是你
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
指针)和 returns bool
如果第一个参数小于第二个参数。 (compare_function
实际上不一定是函数:它也可以是任何具有适当 operator()
或 lambda 的对象)
您可以将向量传递给 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 特性)。