gpt4 book ai didi

以模板作为函数参数的 C++ 自定义比较函数

转载 作者:行者123 更新时间:2023-11-30 02:55:33 25 4
gpt4 key购买 nike

我正在尝试实现/使用比较器样式的接口(interface),就像您在 Java 中找到的那样,它允许我将通用比较器类型传递给函数并使用它来对数据集进行排序。

这是因为我需要各种不同的比较函数,我希望能够将我需要的那个传递给排序函数。

这是我到目前为止的代码片段,希望您能明白我的意思:

void Population::sort(const std::shared_ptr<Comparator<Solution>>& comparator)
{
std::sort(data.begin(), data.end(), comparator.get());
}

以及我尝试实现的比较器接口(interface)

template <typename T> class Comparator : public std::binary_function<T,T,bool>
{
public:
virtual ~Comparator ();
virtual bool operator() ( const T &o1, const T &o2 ) = 0;
};

这可能是我做错的很明显的事情,因为我不太了解 C++。

干杯!

最佳答案

除非您明确需要在运行时更改比较谓词,否则我会选择使 Population::sort 函数成为模板函数:

struct Person
{
std::vector<int> v;

template<typename P>
void sort(P& p)
{
std::sort(v.begin(), v.end(), p);
}
};

这为您的谓词提供了广泛的选择。如:

bool mycompare(int a, int b)
{
return a < b;
}

struct predicate
{
bool operator()(int a, int b)
{
return a < b;
}
};

struct myclass
{
bool function(int a, int b)
{
return a < b;
}
};

int main()
{

Person p;

// you can use a lambda
p.sort([](int a, int b){return a < b;});
// you can use a functor
predicate pred;
p.sort(pred);
// you can use a free function
p.sort(mycompare);
// you can bind to a class member function
myclass c;
p.sort(std::bind(&myclass::function, &c, std::placeholders::_1, std::placeholders::_2));
std::copy(p.v.begin(), p.v.end(), std::ostream_iterator<int>(std::cout));
}

像这样使用模板函数具有很大的灵 active 。

关于以模板作为函数参数的 C++ 自定义比较函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16341472/

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