我需要在容器中存储唯一对象。该对象提供operator==
和operator!=
(operator<
或operator>
)。
我无法使用std::set
,因为它需要operator<
。
我不能使用std::unordered_set
因为它需要哈希函数而我没有。假设我不能写一个考虑我的对象类型(或者我很懒)。
我真的被迫使用std::vector
,并确保自己项目不会在容器中重复(使用std::find
使用operator==
)?
是否真的没有可用于仅使用operator==
存储唯一商品的容器?
答案 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_back
或std::vector::insert
先使用std::find
检查该元素是否已存在于该向量中。
或者在所有插入结束时,将std::unique
与std::vector::erase
结合使用以删除重复项。