c++中一个结构的qsort

qsort of a structure in c++

本文关键字:一个 结构 qsort c++      更新时间:2023-10-16

我试图对结构进行排序,但出现了以下错误:

    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])

相关文章: