C++排序方法

Posted

技术标签:

【中文标题】C++排序方法【英文标题】:C++ sort method 【发布时间】:2010-04-26 22:15:14 【问题描述】:

我想使用 std::sort 对向量进行排序,但我的排序方法是一个类的静态方法,我想在它之外调用 std::sort,但这样做似乎很麻烦。

在课堂上:

static int CompareIt(void *sol1, void *sol2)  ... 

std::sort 调用:

sort(distanceList.at(q).begin(), 
     distanceList.at(q).end(), 
     &DistanceNodeComparator::CompareIt);

不应该这样吗?

【问题讨论】:

您似乎混淆了 std::sort 和 qsort。 【参考方案1】:

std::sort 接受一个比较器,该比较器接受集合中保存的类型的值并返回bool。它通常应该实现一些< 的概念。例如,假设您的 distanceList 元素具有整数集合(我假设它们没有,但为了示例):

static bool CompareIt(int sol1, int sol2)  ... 

当然,如果还没有一个 < 运算符可以为您的场景做正确的事情,您只需要提供一个比较器。

【讨论】:

【参考方案2】:

应该是布尔方法(sort默认使用运算符

【讨论】:

【参考方案3】:

您提供的比较函数具有qsort 所需的签名,这是C++ 出现之前C 提供的排序函数。 sort 需要完全不同的函数。

例如,如果您的 distanceList 声明是 std::vector<DistanceNode>,您的函数将如下所示:

static bool CompareIt(const DistanceNode &sol1, const DistanceNode &sol2)

    return sol1.key < sol2.key;

请注意,使用标准sort 算法对std::list 进行排序效率不高,这就是list 提供自己的sort 成员函数的原因。

【讨论】:

【参考方案4】:

正如其他人提到的,it needs a boolean return type。这是一个有效的示例:

#include "stdafx.h"
#include <vector>
#include <algorithm>

using namespace std;

class MyClass

public:
    static bool CompareIt(const void *a1, const void *a2)
    
        return a1 < a2;
    
;


int _tmain(int argc, _TCHAR* argv[])


    // Create a vector that contains elements of type MyData
    vector<void*> myvector;

    // Add data to the vector
    myvector.push_back((void*)0x00000005);
    myvector.push_back((void*)0x00000001);

    // Sort the vector
    std::sort(myvector.begin(), myvector.end(), MyClass::CompareIt);

    // Display some results
    for( int i = 0; i < myvector.size(); i++ )
    
        printf("%d = 0x%08X\n", i, myvector[i] );
    

    return 0;

[编辑] 更新了上面的代码,使其更简单一些。我并不是说它是很好的代码,但是如果不了解更多关于 OP 的实际实现,很难给出更好的例子!

【讨论】:

在您的示例中,如果仅调用 我不得不说这是(ab)使用 STL 的糟糕方式。虽然可能拥有void * 的向量,但实际上这样做并不是一个好主意。 我只是想要一个示例,该示例显然可以作为 OP 在他/她的问题中提出的原则证明。当然,当 OP 没有发布他们实际解决的问题的完整细节时,这是一个无用/危险的例子。【参考方案5】:

首先,返回类型应该是bool。实际上,要求只是返回类型可以分配给boolint 是。但是您返回 int 的事实表明您可能编写了一个三路比较器,而不是 std::sort 要求的严格的弱排序。

您的 CompareIt 函数将两个 void* 指针作为参数。 distanceList.at(q)vector&lt;void*&gt;(或可转换为 void* 的向量)?如果不是,那么比较器输入也不正确。将void* 与算法一起使用也表明您做错了什么,因为泛型编程的大部分意义在于您不需要稍后会被强制转换回其原始类型的不透明指针。

【讨论】:

以上是关于C++排序方法的主要内容,如果未能解决你的问题,请参考以下文章

C++运用循环+数组实现排序的四种常用方法(桶排序冒泡排序选择排序插入排序)

关于C++中vector和set使用sort方法进行排序

C++ - 将项目添加到排序数组的最快方法

八大经典排序算法的理解动图演示和C++方法实现

重载比较符号“<”时,在C++中升序排序的正确方法是啥

c++排序方法及记忆