19

にコメントしたにもかかわらず、次のコードがコンパイルされるのはなぜですかA::operator<<次のコードの出力が、演算子なしでどのように昇順で出力されるのだろうか。降順に変更するにはどうすればよいですか? (:の定義を提供しない限り、A代わりに使用すると、このコードはコンパイルされません)A*A::operator<

#include <iostream>
#include <set>

using namespace std;

class A
{
public:
    A(int v):x(v){}
    virtual ~A(){}
    int x;
    /*bool operator<(const A &a) const
    {
        return x > a.x;
    }*/
};

int main()
{
    set<A*> numbers;
    A* a1 = new A(1);
    A* a2 = new A(2);
    A* a3 = new A(3);
    numbers.insert(a2);
    numbers.insert(a3);
    numbers.insert(a1);
    for(set<A*>::iterator itr = numbers.begin();itr!=numbers.end();itr++)
    {
        cout << (*itr)->x << endl;
    }
    // output: 1 2 3
    return 0;
}
4

4 に答える 4

29

一連のポインターがあるため、コードはコンパイルされます。セットにはポインターが含まれており、オペレーターはポインターを比較するのではなく、 type のオブジェクトを比較するAため、セットには必要ありません。セットで使用される既存のポインタより小さい比較演算子があります。

厳密な弱い順序付けを実装する独自のコンパレータを提供することで、順序付けを変更できます。

struct APtrComp
{
  bool operator()(const A* lhs, const A* rhs) const  { /* implement logic here */ }
};

そして、それを 2 番目のテンプレート パラメーターとして使用して、セットをインスタンス化します。

set<A*, APtrComp> numbers;
于 2012-11-05T14:28:42.600 に答える
3

一連のポインターがあります。通常、ポインタは昇順で割り当てられます。ポインターにはデフォルトの<演算子があります。これがコンパイルして動作している理由です。

Ps 値に関係なく、この順序で A1 A2 A3 の値が出力されます。

...
A* a1 = new A(9);
A* a2 = new A(5);
A* a3 = new A(1);
...
 // output: 9 5 1
于 2012-11-05T14:32:17.170 に答える
1

ポインター演算を覚えている場合、すべてのポイントには、操作で使用する一連の演算子が与えられます (これには operator< が含まれます)。あなたのセットは、このデフォルトの演算子 < を使用します。

于 2012-11-05T14:34:17.270 に答える
0

A*私が理解していることから、コードがなくてもコードがコンパイルされる理由operator<と、順序を昇順から降順に変更する方法を知りたいと思っています。ポインターアドレスで

使用しているため、コンパイルされます。 に変更 すると、簡単に確認できます:)を使用している場合 、コードがコンパイルされないのは正常です。並べ替えられたメンバーを挿入するために何を比較すればよいかわかりません。したがって、その演算子を提供する必要があります。 引き続きポインターを使用したい場合は、@juanchopanza が提供するコードを使用できます。operator<
cout << (*itr)->x << endl;
cout << (*itr)->x << ' ' << *itr << endl;

operator<set<A>


于 2012-11-05T15:08:22.363 に答える