定义哪个容器来存储没有运算符的唯一值<
What container to store unique values with no operator< defined
我需要在容器中存储唯一的对象。对象提供一个operator==
和operator!=
(operator<
或operator>
)。
我不能使用std::set
,因为它需要operator<
。我不能使用std::unordered_set
,因为它需要一个哈希函数,我没有。假设考虑到我的对象类型,我不能写一个(或者我很懒)。
我真的被迫使用std::vector
并确保自己的项目不会在容器中重复(使用使用operator==
的std::find
)吗?
真的没有容器可以用来存储唯一的项目只使用operator==
吗?
确实没有标准容器,这是因为它的效率很低。O(N)
,准确地说,就是你想象中的蛮力搜索。
std::set<T>
和std::unordered_set<T>
都通过利用t的一个重要属性来避免暴力搜索。缺少任何一个属性,容器中现有的N个成员中的任何一个都可能等于一个潜在的新值V,因此必须使用operator==
反复比较所有N个成员。
"假设考虑到我的对象类型,我无法编写散列函数(或者我很懒)。"
好吧,你很懒,但我还是给你写一个:template<typename T> size_t degenerate_hash(T) { return 0; }
。
当然,这意味着您将获得O(N)性能,因为每个值都与其他值相冲突,但这无论如何都是最好的结果。
使用std::vector
,在std::vector::push_back
或std::vector::insert
之前,先使用std::find
检查该元素是否已经存在于vector中。
或者在所有插入的末尾使用std::unique
和std::vector::erase
来删除重复项
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 何时在引用或唯一指针上使用移动语义
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 计算排序向量的向量中唯一值的计数
- C++ 包含唯一指针成员变量的类的赋值运算符
- C++14 不能调用从唯一指针继承的类的复制构造函数或运算符 =
- 唯一指针中的赋值运算符错误
- 错误:与“锅炉::唯一实例 == 0l”中的“运算符==”不匹配
- [唯一相等运算符]在集合中查找重复元素并将其分组的快速算法是什么
- 条件运算符是在全局作用域中初始化全局变量的唯一方法
- 定义哪个容器来存储没有运算符的唯一值<
- 为什么~=是C++中唯一缺少的非逻辑赋值运算符
- 为什么控制台在使用运算符的地址时只打印整数变量的1个唯一地址