Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向量对象C++的快速排序函数_C++_Class_Sorting_Vector - Fatal编程技术网

向量对象C++的快速排序函数

向量对象C++的快速排序函数,c++,class,sorting,vector,C++,Class,Sorting,Vector,我试图将此函数转换为使用向量对象而不是整数数组。 向量对象如下所示: std::vector<Heltal *> htal; Heltal类包含一个名为Heltal的私有整数 如何使用下面的函数对htal向量进行排序 void Array::Sort(int a[], int first, int last) { int low = first; int high = last; int x = a[(first+last)/2]; do {

我试图将此函数转换为使用向量对象而不是整数数组。 向量对象如下所示:

std::vector<Heltal *> htal;
Heltal类包含一个名为Heltal的私有整数

如何使用下面的函数对htal向量进行排序

void Array::Sort(int a[], int first, int last)
{
    int low = first;
    int high = last;
    int x = a[(first+last)/2];
    do {
        while(a[low] < x) {
            low++;
        }
        while(a[high] > x) {
            high--;
        }
        if(low<=high) {
            std::swap(a[low],a[high]);
            low++;
            high--;
        }
    } while(low <= high);
    if(first < high)
        Array::Sort(a,first,high);
    if(low < last)
        Array::Sort(a,low,last);
}

正确的解决方案是放弃自定义排序并从中使用。这几乎可以保证在任何情况下都会更快、更优化。那么你就有:

#include <algorithm>
...
std::vector<Heltal *> htal;
...
// sort by pointer value
std::sort(htal.begin(), htal.end());
如果您想按对象值而不是指针值进行排序,可以使用std::vector而不是std::vector(这几乎肯定是您应该做的),或者将比较函数传递给std::sort

使用C++11 lambda进行此操作的示例:

std::sort(htal.begin(), htal.end(), [](Heltal *a, Heltal *b) { return *a < *b; }); 

正确的解决方案是放弃自定义排序并从中使用。这几乎可以保证在任何情况下都会更快、更优化。那么你就有:

#include <algorithm>
...
std::vector<Heltal *> htal;
...
// sort by pointer value
std::sort(htal.begin(), htal.end());
如果您想按对象值而不是指针值进行排序,可以使用std::vector而不是std::vector(这几乎肯定是您应该做的),或者将比较函数传递给std::sort

使用C++11 lambda进行此操作的示例:

std::sort(htal.begin(), htal.end(), [](Heltal *a, Heltal *b) { return *a < *b; }); 


你想到了什么?别再使用指针了。重点是什么?你试过了吗?不应该有任何改变。另外,您不需要数组::in-Array::Sorta,low,last;是的,我尝试过用htal参数替换int a[]参数,但我怀疑在函数中存储大量Heltal对象是否是最好的方法。Kerrek SB可以推荐一种更好的方法,如果你知道的话。你想出了什么主意?停止使用指针。重点是什么?你试过了吗?不应该有任何改变。另外,您不需要数组::in-Array::Sorta,low,last;是的,我尝试过用htal参数替换int a[]参数,但我怀疑在函数中存储大量Heltal对象是最好的方法。Kerrek SB可以自由推荐一种更好的方法,如果你知道的话。我相信他想按对象内部的int值排序。这是正确的标记,向量对象可以这样打印,这是我知道的唯一方法,至少是htal[0][0]。@krafs如果您为类定义了操作符<,那么您可以使用std::sort,这很好,您不需要获取任何内部成员。或者,您可以将传递给std::sort的比较函数作为类的一个朋友。哈,哈,抱歉,wjl提供了一些小信息,看起来您的解决方案是正确的。现在我觉得我们正在做“克拉夫家庭作业”。@马克,也许你是对的!但是如果是快速排序作业,教授可能不喜欢只使用std::sort=我相信他想按对象内部的int值进行排序。这是正确的标记,向量对象可以这样打印,这是我知道的唯一方法,至少是htal[0][0]。@krafs如果您为类定义了操作符<,那么您可以使用std::sort很好,您不需要获取任何内部成员。或者,您可以将传递给std::sort的比较函数作为类的一个朋友。哈,哈,抱歉,wjl提供了一些小信息,看起来您的解决方案是正确的。现在我觉得我们正在做“克拉夫家庭作业”。@马克,也许你是对的!但是如果是快速排序作业,教授可能不喜欢只使用std::sort=