在C做正确的方法+ +是通过模板。
对某事进行排序是一种算法,它通常几乎没有持久状态。排序不是一个对象 - 它是一个数据函数(可能是对象)。
的std
库已经有一个排序,与此签名:
template<typename I, typename C = std::less<typename std::iterator_traits<I>::value_type> >
void sort(I begin, I end, C comp = C());
的迭代器begin
和end
表示的值的范围进行排序,并且comp为仿函数(或功能),当通过两项值范围的元素告诉你第一个是否小于第二个。
要在std::vector
利用这一点,你会做这样的事情:
std::vector<int> myVector; // assume it has some data in it
sort(myVector.begin(), myVector.end());
性病::排序(通常?)一个快速排序。但该界面适用于快速,泡泡和插入排序。
这种方法的一大优点是一种可以使用另一种。例如,尽管大数据集上的快速排序速度较快,但通常在小数据集上,插入排序的简单性会得到提高(较低的常数因子,即使存在n^2开销)。因此,通过编写这样的排序,当元素数量很少时,快速排序的递归调用可以变为插入排序。
现在,如果您需要运行时替换您正在使用的算法,则需要确定您正在使用的迭代器,甚至可能是比较器。这可以通过一个通用的函数签名(我会这样做)或者一个纯虚拟接口的基类来实现(我建议不要这样做)。请注意,运行时选择的比较器的开销并不重要,但是。对于任何合理大小的容器来说,只要不是在算法的递归调用中完成,来自固定迭代器选项或指向函数或虚方法调用的开销将非常便宜。
谢谢:)在“算法”中,我是否需要为每种气泡排序,插入排序等创建/对象。 ...我想使用模板,如果不是用于触发哪种排序计算,但排序数据的数据类型 – Phorce
谢谢:)!所以对于Template方法,BubbleSort等..仍然会继承Sort? – Phorce
不,'sort_algorithm_interface'不需要其他东西。你只需要添加代码,其中'/ *排序输入* /'。 – andre