其他分享
首页 > 其他分享> > 如何在C中使用自定义排序成员函数的sort()?

如何在C中使用自定义排序成员函数的sort()?

作者:互联网

我有一个关于将比较函数传递给sort()的问题.

我想要做的是定义一个sort()函数,该函数在计算时考虑了我想要进行排序的类的成员变量.

基本上,我的代码看起来像这样(简化为只显示相关部分):

MappingTechnique.h

struct MappingTechnique {
    vector<int> usedIndexCount; 
};

struct SimpleGreedyMappingTechnique : MappingTechnique {
    bool sortByWeights(int index1, int index2);
};

MappingTechnique.m

bool SimpleGreedyMappingTechnique::sortByWeights(int index1, int index2) {
    return usedIndexCount[index1] > usedIndexCount[index2];
}

void SimpleGreedyMappingTechnique::processFrame(Frame frame) {
    vector<int> payloadIndices = <generate the vector>

    // sort the payload indices according to their current usedIndexCount
    sort(payloadIndices.begin(), payloadIndices.end(), sortByWeights);
}

此代码无法编译,它会出现以下错误:

 error: reference to non-static member function must be called

并指向sortByWeights.

甚至可以使用类的成员函数进行排序吗?如果是,我该如何实现呢?

解决方法:

它是,但一般来说,我鼓励只使用适当的函子或lambda:

使用lambda:

std::sort(payloadIndices.begin(), payloadIndices.end(), [this](int a, int b){
    return this->sortByWeights(a, b);
});

或者使用std :: mem_fn:

auto sorter = std::bind(std::mem_fn(SimpleGreedyMappingTechnique::sortByWeights), this);
std::sort(payloadIndices.begin(), payloadIndices.end(), sorter);

或者使用仿函数:

namespace{
struct indicies_less_than
{
    const SimpleGreedyMappingTechnique & mapping_tech;
    indicies_less_than(const SimpleGreedyMappingTechnique & mapping_tech)
       :mapping_tech(mapping_tech){}

    bool operator()(int a, int b)
    {
       return mapping_tech.sortByWeights(a, b);
    }
};
}

std::sort(payloadIndices.begin(), payloadIndices.end(), indicies_less_than(*this));

注意:

如果被排序的类型比int更复杂,那么你肯定希望通过const&防止复制

标签:c,sorting,functor
来源: https://codeday.me/bug/20190725/1528354.html