2

カルテット (定義したクラス) の 2 つのセットをマージしようとしています。

マージに入る前に、演算子のオーバーロードについて質問させてください。クラスの演算子をオーバーロードしたい場合、クラス内で行うかクラス外で行うかによって違いはありますか? たとえば、クラス内でそれを行った場合、関数ヘッダーは次のようになります

bool quartet::operator<(const quartet& other)

しかし、クラスの外でそれを行った場合、関数ヘッダーは

bool operator<(const quartet& one, const quartet& two);

これを書いている時点ではエラーを再現できませんでしたが、ある場所でいくつかのエラーを排除し、別のエラーを作成したと信じているため、2 つを切り替えてきました。

では、マージに進みます。現在、次のコードが機能しています (A、B、C、および D は上記で定義されており、A==C)

  set<quartet> Qset;
  set<quartet> result;
  Qset.insert(A);
  Qset.insert(B);
  set<quartet> Qset2; 
  Qset2.insert(C);
  Qset2.insert(D);
  merge(Qset.begin(), Qset.end(), Qset2.begin(), Qset2.end(), inserter(result, result.end()));
  printSet(result);

したがって、私の最初の質問は、merge の最後のパラメーターを から に変更するとinserter(result, result.end())result.begin()コンパイラ エラーが発生するということです。

/usr/include/c++/4.6/bits/stl_algobase.h:299:6: error: passing ‘const quartet’ as ‘this’ argument of ‘quartet& quartet::operator=(const quartet&)’ discards qualifiers [-fpermissive]
make: *** [quartet.o] Error 1

なぜこのエラーが発生するのですか? 私の理解では、merge の最後のパラメータは、要素をマージする場所へのイテレータを取るので、なぜそれが result.begin() ではないのでしょうか? さらに、インサータとは正確には何ですか?

より一般的に言えば、最終的には、ソートされた大規模なセットを扱うことになります。merge を呼び出すか、set_union を呼び出す方が速いでしょうか? 2つの違いは何ですか?

最後に、set2.insert(set1.begin(), set1.end()) を呼び出して 2 つのセットをマージできないでしょうか?

ありがとうございました

4

2 に答える 2

2

クラス内とクラス外でオーバーロード演算子を宣言することの違いはC++、呼び出しのセマンティックと暗黙のオブジェクトの順序に依存します。

この呼び出しでは、左端のオブジェクトがカルテット タイプである必要があります。

bool quartet::operator<(const quartet& other)

この呼び出し中に、自動型変換によって quartet に変換できるものはすべて許可します。

bool operator<(const quartet& one, const quartet& two);

カスタム型から std::string への C++ オーバーロード変換演算子を参照してください。

エラーに関連する 2 番目の質問では、< 演算子がクラスを変更できないことを指定する必要があるため、エラーが発生しています。関数を const として指定する必要があります。

bool quartet::operator<(const quartet& other) const

insertを使用して、これら 2 つのセットをマージできます。

于 2013-06-14T17:08:51.513 に答える
1

<オペレーターがクラスを変更しないことをコンパイラーに伝える必要があるため、このエラーが発生しています。constこれを行うには、メンバー関数を次のように宣言します。

bool quartet::operator<(const quartet& other) const

またset2.insert(set1.begin(), set1.end())、うまく機能するようです。

于 2013-06-14T17:03:58.240 に答える