gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:03:27 25 4
gpt4 key购买 nike

我有一个关于将比较函数传递给 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++ - 如何在 C++ 中使用带有自定义排序成员函数的 sort()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29286439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com