3

T *配列、size_t vector_size、size_t容量のデータメンバーを使用して、独自のベクトルクラスVectorを作成しています。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;
}

これは私が得るエラーの1つです:

/usr/include/c++/4.6/bits/stl_algo.h:2212:4:エラー:'* __first <__pivot'</p>の'operator<'に一致しません

4

3 に答える 3

3

間違った署名の比較メソッドを提供しました。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;
}
于 2012-09-30T15:35:01.507 に答える
1

必要なことの1つは、オペレーターのパラメーターで使用することですconst。そうしないと、読み取り専用のパラメーターと一致しません(これは一般的なケースです)。

ただし、ベクトルのベクトルを並べ替えると、スワップが発生するたびにベクトル全体がコピーされることに注意してください。これは特に効率的ではありません。ベクトルが別々に保存されていて、vector-of-pointer-to-vectorのようなものがある場合、少なくとも並べ替えはより高速になります。

「厳密な弱順序」の定義も必ずお読みください。順序がそれ自体と一致していることが非常に重要です。そうしないと、std :: sort()のような標準アルゴリズムが(一部の実装ではメモリを破壊するまで)ひどく誤動作する可能性があります。

于 2012-09-30T15:39:03.403 に答える
1

あなたはconstを忘れました!

template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const // <- here
{
    return (vector_size < source.vector_size);
}
于 2012-09-30T15:34:57.263 に答える