2

並べ替え機能に問題があります...コードは次のとおりです。

class Parola {
public:
    string s;
    int repetition;
    bool operator()(const Parola *x, const Parola *y) {
        return x->repetition > y->repetition;
    }
};


int main(int argc, char** argv) {
    ...
    vector<Parola> p;
    ...
    some insertions here
    ...
    sort(p.begin(), p.end(), Parola());
    ...
    return 0;
}

エラーなしでこれをコンパイルできないのはなぜですか?どうもありがとう!

PS:50を超えるエラーの最初の3行だけを表示します。

/usr/include/c++/4.2.1/bits/stl_algo.h: In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = Parola, _Compare = Parola]':
/usr/include/c++/4.2.1/bits/stl_algo.h:2795:   instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Parola*, std::vector<Parola, std::allocator<Parola> > >, _Size = long int, _Compare = Parola]'
/usr/include/c++/4.2.1/bits/stl_algo.h:2866:   instantiated from 'void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Parola*, std::vector<Parola, std::allocator<Parola> > >, _Compare = Parola]'
4

5 に答える 5

6

コンパレータはポインタを取りますが、ベクトルはParolaインスタンスを保持します。あなたはそれを変える必要があります。ただし、最も簡単なのは、比較未満の演算子を実装することです。

class Parola {
public:
    string s;
    int repetition;
};

bool operator<(const Parola& x, const Parola& y) {
    return x.repetition < y.repetition;
}

sort次に、3番目の引数なしで呼び出すことができます。

sort(p.begin(), p.end());
于 2012-10-08T18:13:31.270 に答える
5

OPに選択できるオプションをいくつか提供します:(注:網羅的ではありません)

オプション1:内部演算子<()

class Parola {
public:
    string s;
    int repetition;
    bool operator<(const Parola& x) const  
    {
        return repetition < x.repetition;
    }
}

デフォルトのstd::less<>テンプレートを使用して呼び出されます。

sort(p.begin(), p.end());

オプション2:内部機能operator()():

class Parola {
public:
    string s;
    int repetition;
    bool operator()(const Parola& x, const Parola& y) const  
    {
        return x.repetition < y.repetition;
    }
}

dasblinkenが指摘したように、オプションの比較オブジェクトで呼び出されますが、奇妙ですが、機能します。

std::sort(p.begin(), p.end(), Parola());

オプション3:外部演算子<()

bool operator <(const Parola& x, const Parola& y)
{
    x.repetition < y.repetition;
}

これは、(1)と同様に、デフォルトのstd :: less <>コンパレータを使用しますが、そのように宣言されている場合、外部オペレータもクラスParolaのフレンドであり、プライベートデータメンバーにアクセスできる必要があります。使い方は(1)と同じです。

オプション4:外部ファンクター

class CompareParola
{
public:
   bool operator ()(const Parola& x, const Parola& y) const
   {
      return x.repetition < right.repetition;
   }
};

そしてによって使用される:

std::sort(p.begin(), p.end(), CompareParola());

(3)と同様に、アクセスされるメンバーがプライベートである場合、CompareParolaクラスはParolaとフレンドリングする必要があります。

オプション5:外部機能

bool ParolaLess(const Parola& x, const Parola& y)
{
    return x.repetition < y.repetition;
}

外部演算子または外部関数クラスと同様に、これもプライベートメンバーにアクセスするためにオブジェクトクラスとフレンドリングする必要があります。そのように呼び出されます:

std::sort(p.begin(), p.end(), ParolaLess);

オプション6:静的クラス関数

class Parola {
public:
    string s;
    int repetition;

    static bool Less(const Parola& x, const Parola& y)  
    {
        return x.repetition < y.repetition;
    }
};

これは十分に活用されていないことが多く、プライベート変数(明らかにクラスで定義されている)を含むすべてのオブジェクトメンバー変数にアクセスできるという非常に優れた属性があります。これを使用するには、次のようにします。

std::sort(p.begin(), p.end(), Parola::Less)

これは、(1)や(2)と同様に、すべてをクラスに保持することに注意してください。

これらすべての中で、私は(1)その単純さ、および(4)その独立性のために好みますが、誰もが自分の好みを持っています。(5)または(6)が本当に役立つ場合があります(そして私は(6)の個人的なファンです)。

これ以上考えて、担当者に編集してもらうことができる場合は、必要に応じてこれを更新してください。少なくともある程度役立つようにしてください=P

于 2012-10-08T18:40:59.007 に答える
3

差し迫った問題は、比較演算子が渡されParola const*たオブジェクトではなくParola const&オブジェクトを取得することです。イテレータは参照解除されて、実際に比較される値を取得します。

次の問題は、比較オブジェクトを実際のオブジェクトにバンドルしようとすべきではないということです。比較オブジェクトは実際にはParolaオブジェクトのように動作しません。個別のコンパレータが必要です。これは、次のコマンドで使用されstd::sort()ます。

sturct ParolaCompare {
    bool operator()(Parola const& p0, Parola const& p1) const {
        // return something defining a strict weak order on Parola objects
    }
};
// ...
std::sort(v.begin(), v.end(), ParolaCompare());

または、オブジェクトに適したものを定義することもできますoperator<()Parola

bool operator< (Parola const& p0, Parola const& p1) {
    // again, a strict weak order on Parola objects
}
于 2012-10-08T18:17:08.110 に答える
2

演算子がポインタの代わりにconst参照を取るようにします。つまり

bool operator()(const Parola &x, const Parola &y) { 
    return x.repetition > y.repetition; 
}
于 2012-10-08T18:14:53.347 に答える
-1

一般に、sortメソッドを使用するか、std :: setに配置することで、STLにソートさせたいオブジェクトがある場合は常に、operator<メソッドが必要です。

したがって、それをクラスのメンバーにするのが最善です。そのメソッドのシグネチャは次のようになります。booloperator<(const Parola&left、const Parola&right)

それをどのように実装するかは、クラス自体に依存します。

于 2012-10-08T18:16:14.483 に答える