为向量类编写 sort() 方法

Writing a sort() method for a vector class

本文关键字:方法 sort 向量      更新时间:2023-10-16

我正在编写自己的向量类 Vector,其中包含数据成员:T* 数组、size_t vector_size 和size_t容量。我正在尝试创建一个sort()方法:

template <class T>                                                                                                 
void Vector<T>::sort(bool ascending)                                                                                 
{                                                                                                                   
    std::sort(array,array+vector_size);                                                                              
    if(ascending==false)                                                                                             
        std::reverse(array,array+vector_size);                                                                      
}   

当数组中的元素是 int、char 等类型时,它可以正常工作。但是当我尝试对由 Vector 元素组成的向量进行排序时,它不会编译。根据我所读到的内容,我需要以某种方式定义<运算符,但我真的不知道该怎么做......

我试过:

template <class T>
bool Vector<T>::operator<(Vector<T> & source) const
{
    return (vector_size < source.vector_size);
}

我的主要外观是这样的:

int main() {
    Vector<int> v1(5,1);
    Vector<int> v2(7,2);
    Vector<int> v3(3,3);
    Vector<Vector<int>> v4;
    v4 = {v1,v2,v3};
    v4.sort(1);
return 0;
}

这是我得到的错误之一:

/

usr/include/c++/4.6/bits/stl_algo.h:2212:4:错误:与"* __first <__pivot"中的"运算符<"不匹配

您提供的比较方法具有错误的签名。您需要接受 const 引用或值,但不接受对类型的(可修改)引用,而前者应该是首选的,除非它是基元类型。因此,比较方法的签名应如下所示:

template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const
{
    return (vector_size < source.vector_size);
}

这是因为std::sort(以及许多其他方法)旨在不修改内容。如果它们采用值(但对于大型类型来说这会很慢)或 const 引用,则可以保证这一点。

请注意,您定义了比较方法以比较向量的大小,而不是其内容。所有向量的长度都相等。所以他们被std::sort视为平等.所以std::sort不会改变v4...如果您打算以类似于字符串比较的方式比较内容(第一个条目首先计数,如果相等,则取下一个条目,依此类推...),请使用以下命令:

template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const
{
    for(int i = 0; i < size && i < source.size; ++i) {
        if(*this[i] < source[i])
            return true;
        else if(source[i] < *this[i])
            return false;
    }
    // You have to decide what to do if the length isn't equal.
    // But if the vectors are really equal than return false:
    if(size == source.size)
        return false;
}

你忘了一个康斯特!

template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const // <- here
{
    return (vector_size < source.vector_size);
}
您需要的

一件事是在运算符的参数中使用const,否则它无法匹配任何只读内容(这是常见情况)。

请记住,每次发生交换时,对向量的排序都会复制整个向量。 这不会特别有效。 如果向量是单独存储的,并且您有类似向量到向量的矢量,则至少排序会更快。

请务必阅读"严格弱排序"的定义。 排序与自身保持一致非常重要,否则像 std::sort() 这样的标准算法可能会严重行为不端(在某些实现中会损坏内存)。