我正在尝试合并两组四重奏(我已经定义的一个类)。
在我进入合并之前,让我问一个关于运算符重载的问题。如果我想重载一个类的运算符,是在类内还是类外做有区别吗?例如,如果我在课堂上这样做,我的函数头将是
bool quartet::operator<(const quartet& other)
但是如果我在课堂之外做,我的函数头会是
bool operator<(const quartet& one, const quartet& two);
我一直在两者之间切换,因为我相信它在一个地方消除了一些错误,但又创造了另一个地方,尽管我在撰写本文时无法复制它们。
好的,现在开始合并。现在下面的代码正在运行(上面定义了 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())
to更改为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() 呢?此外,插入器到底是什么?
更一般地说,我最终将使用大型排序集。调用合并或调用 set_union 会更快吗?两者有什么区别?
最后,我可以不只是调用 set2.insert(set1.begin(), set1.end()) 将两个集合合并在一起吗?
谢谢