カルテット (定義したクラス) の 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 つのセットをマージできないでしょうか?
ありがとうございました