我在使用C ++中的比较器时遇到了问题。现在,我只是尝试使用通用参数在Goodrich的书“数据 C ++中的结构和算法”中实现快速排序。以下是本书的代码:
#include <iostream>
#include <vector>
#include <functional>
template <typename E, typename C> // quick-sort S void quickSort(std::vector<E>& S, const C& less) {
void quickSort(std::vector<E>& S, const C& less){
if (S.size() <= 1)
{return;}// already sorted
quickSortStep(S, 0, S.size()-1, less); // call sort utility
}
template <typename E, typename C>
void quickSortStep(std::vector<E>& S, int a, int b, const C& less) {
if (a >= b) {return;}
E pivot = S[b];
int l=a;
int r=b-1;
while (l <= r) {
while (l <= r && !less(pivot, S[l]))
{l++;}//pivot is greater than S[l]
while (r >= l && !less(S[r], pivot))
{r--;}
if (l < r)
{std::swap(S[l], S[r]); std::swap(S[l], S[b]);}
quickSortStep(S, a, l-1, less);
quickSortStep(S, l+1, b, less);
}
}
我找到了一个模板的代码,可以比较整数和双精度,并试图让它适用于这个程序。但是,当我将函数isLess
作为参数传递并尝试运行程序时,我得到了一个构建错误:Call to function 'quickSortStep' that is neither visible in the template definition nor found by argument-dependent lookup
。我已经粘贴了下面的isLess
函数以及我的main
的代码,并且非常感谢有关如何实现比较器的任何建议。
template <typename T>
bool isLess(T a, T b)
{
return a<b;
}
int main(int argc, const char * argv[]) {
//vector and comparator
int myInts[]={15,2,7,99};
std::vector<int>myVec(myInts,myInts+sizeof(myInts)/sizeof(int));
int a,b;
quickSort(myVec,isLess<int>(a, b));
return 0;
}
EDIT ::
这本书的代码没有正确排序,所以我对quickSortStep()
进行了以下调整,现在工作正常:
void quickSortStep(std::vector<E>& S, int a, int b, const C& less) {
if (a >= b) {return;}
E pivot = S[b];
int l=a;
int r=b-1;
while (l <= r) {
while (l <= r && !less(pivot, S[l]))
{l++;}//pivot is greater than S[l]
while (r >= l && !less(S[r], pivot))
{r--;}
if (l < r)
{
std::swap(S[l], S[r]);
}
}
std::swap(S[l], S[b]);
quickSortStep(S, a, l-1, less);
quickSortStep(S, l+1, b, less);
}
答案 0 :(得分:0)
以下代码回答了您的问题。但快速排序不起作用。也许你错误地转录了它。
template <typename T>
bool isLess(T a, T b)
{
return a<b;
}
int main(int argc, const char * argv[]) {
//vector and comparator
std::vector<int> myVec { 15,2,7,99 };
quickSort(myVec,isLess<int>);
auto OK = std::is_sorted(myVec.begin(), myVec.end());
assert(OK);
return 0;
}