需要覆盖哪个运算符才能在C++代码中使用 std::set
Which operator needs to be overridden in order to use std::set in the C++ code?
这是一个面试问题。
参考示例代码,需要覆盖其中一个运算符才能使用
std::set<Value>
#include<iostream>
class Value
{
std::string s_val;
int i_val;
public:
Value(std::string s, int i): s_val(s) , i_val(i){}
};
// EOF
/*
a operator !=
b operator >
c operator <=
d operator >=
e operator <
*/
实际上,我不明白为什么需要在这里覆盖运算符。"set"不允许重复的元素,也许运算符!=需要被覆盖?
您不必覆盖任何运算符,std::set
类模板允许您提供比较函数作为模板参数。但是,如果您要提供运算符,则需要bool operator<()
。该运算符必须实现严格的弱排序。请参阅此 std::set 文档。
使用严格弱排序的原因是 set 是一个有序容器,通常实现为自平衡二叉树。因此,仅仅知道两个元素是否相同是不够的。该集必须能够订购它们。小于运算符或比较器函子也用于测试元素相等性。
您需要
为您的类型实现operator<
。实现必须遵循弱排序才能与标准库中的关联容器(如 std::set
和 std::map
)一起使用。
阅读:
- 严格的弱排序
这里有一个例子:
- 标准映射组合键
集合通过使用
等价概念来保留重复项,而无需operator=
或operator!=
。如果两个项目都不小于另一个项目,则两个项目是等效的:
if (!(a < b || b < a))
// equivalent!
为了加快执行无重复元素的速度,并通常检查元素是否在其通常的某种树中并且只需要运算符<。(less的唯一用法由标准强制执行,其余的只是avarage实现)
相关文章:
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- "std::forward"和"std::move"真的不生成代码吗?
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- std::string == 运算符在代码中不起作用
- 为什么 std::invocable 概念阻止了此代码的编译
- 如何防止使用 std::shared_ptr 的代码中的内存泄漏
- "p"数组如何使用 std::normal_distribution 存储以下代码中的值C++?
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- 如何处理给定代码中的 std::out_of_range 错误?
- 在带有模板的函数中传递未知大小的 std::数组.如何更正此代码?
- 如何使用 GDB 从功能C++逐步调试到 std::function 用户代码?
- 避免使用 std::any 编写相同的重复类型检查代码
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 如何在数组类型的模板代码中计算std::size_t
- 将json代码格式化为std::string
- std::out_of_range 使用 libserial 库的 C++ 代码中的错误
- 为什么代码使用 std::map 无法编译?
- 这段 C++ 代码的奇怪行为(std::wcout 和 std::exception)