c++ - C++ 中的合并集合,以及重载运算符

标签 c++ stl set

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

在开始合并之前,让我问一个有关运算符重载的问题。如果我想重载一个类的运算符,在类内还是在类外进行有区别吗? 例如,如果我在类中执行此操作,我的函数头将是

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()) 更改为 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() 呢?另外,inserter到底是什么?

更一般地说,我最终将使用大型的排序集。调用 merge 或调用 set_union 会更快吗?两者有什么区别?

最后,我可以不直接调用 set2.insert(set1.begin(), set1.end()) 将两个集合合并在一起吗?

谢谢

最佳答案

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

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

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

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

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

参见C++ overloading conversion operator for custom type to std::string

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

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

您可以使用insert来合并这两个集合。

关于c++ - C++ 中的合并集合,以及重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17113480/

相关文章:

c++ - XML 搜索算法 C++

c++ - 为什么 du -sh 输出错误大小的内存映射文件?

矩阵类的 C++ 自定义迭代器

C++ 编译器错误 : ISO C++ forbids declaration of ‘set’ with no type

c++ - 派生函数图

c++ - 重新分配 vector 的内存

c++ - 您将如何根据元素的某些属性删除 std::vector 的元素?

php - MySQL 查询 - 将字符串与集合类型进行比较

减少内存占用的 Java 集

c++ - 带有可变模板参数的部分特化,后跟其他参数