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

时间:2016-08-23 14:02:19

标签: c++ c++11 stl containers

我需要在容器中存储唯一对象。该对象提供operator==operator!=operator<operator>)。

我无法使用std::set,因为它需要operator<。 我不能使用std::unordered_set因为它需要哈希函数而我没有。假设我不能写一个考虑我的对象类型(或者我很懒)。

我真的被迫使用std::vector,并确保自己项目不会在容器中重复(使用std::find使用operator==)?

是否真的没有可用于仅使用operator==存储唯一商品的容器?

3 个答案:

答案 0 :(得分:4)

确实没有标准容器,因为它效率低下。确切地说,O(N) - 恰恰是你想象的蛮力搜索。

std::set<T>std::unordered_set<T>都利用T的非平凡属性来避免蛮力搜索。缺少任何一个属性,容器的任何现有N个成员都可以等于因此,您必须反复使用operator==比较所有N个成员。

答案 1 :(得分:2)

&#34;我们说我不能考虑我的对象类型(或者我懒惰)写一个哈希函数。&#34;

嗯,你很懒,但我还是会为你写一个:template<typename T> size_t degenerate_hash(T) { return 0; }

当然,这意味着你获得了O(N)性能,因为每个值都与其他所有值相冲突,但无论如何这是最好的结果。

答案 2 :(得分:1)

使用std::vector,然后std::vector::push_backstd::vector::insert先使用std::find检查该元素是否已存在于该向量中。

或者在所有插入结束时,将std::uniquestd::vector::erase结合使用以删除重复项。