2

我正在尝试合并两组四重奏(我已经定义的一个类)。

在我进入合并之前,让我问一个关于运算符重载的问题。如果我想重载一个类的运算符,是在类内还是类外做有区别吗?例如,如果我在课堂上这样做,我的函数头将是

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()) 将两个集合合并在一起吗?

谢谢

4

2 回答 2

2

在类内部和外部声明重载运算符之间的区别C++取决于调用语义和隐含对象的顺序。

此调用需要最左边的对象是四重奏类型。

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

在此调用期间,允许任何可以通过自动类型转换转换为四重奏的内容。

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

请参阅C++ 重载转换运算符以将自定义类型转换为 std::string

通过第二个与错误相关的问题,您得到它是因为您需要指定 < 运算符无法修改该类。您需要将函数指定为 const:

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

并且您可以insert用来合并这两组。

于 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 回答