定义哪个容器来存储没有运算符的唯一值<

What container to store unique values with no operator< defined

本文关键字:唯一 运算符 lt 存储 定义      更新时间:2023-10-16

我需要在容器中存储唯一的对象。对象提供一个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_backstd::vector::insert之前,先使用std::find检查该元素是否已经存在于vector中。

或者在所有插入的末尾使用std::uniquestd::vector::erase来删除重复项