QMultiHash重复项的insert()行为

时间:2013-07-16 18:00:21

标签: c++ qt data-structures qt4 hashtable

我有QMultiHash<Key, Value*>。我可能每个Value*有多个Key,所以我确实要存储与每个Value*对应的每个Key,但我不想存储精确的副本key1 == key2 && value1 == value2不止一次。

如果我使用已在哈希中的QMultiHash::insert( Key, Value* )对调用Key/Value*,是否会添加第二个副本?换句话说,如果我使用相同的insert()对多次呼叫Key/Value*,然后拨打QMultiHash::values( Key ),我将获得相同的Value*一次,或者我会获得Value*列表与我调用插入的次数相同?

2 个答案:

答案 0 :(得分:2)

没有。根据定义,QMultiHash允许与给定键关联的多个值。那是QMultiHash的“多”部分。例如,

QMultiHash<int, int> multi;         //multi.size() = 0
multi.insert(5, 1);                 //multi.size() = 1
multi.insert(5, 2);                 //multi.size() = 2
QList<int> list(multi.values(5);)   //list = {2, 1};

如果要强制使用唯一键,则应使用QHash将此事实传达给其他程序员,并在插入之前检查'QHash::contains(key)'。另请注意,广告订单很重要!

同样,QMultiHash允许重复键值对,而不仅仅是重复键。例如,

QMultiHash<int, int> multi;         //multi.size() = 0
multi.insert(5, 2);                 //multi.size() = 1
multi.insert(5, 2);                 //multi.size() = 2
QList<int> list(multi.values(5);)   //list = {2, 2};

如果您希望使用单个键允许多个值,但仍然强制使用唯一键值对,则必须在使用QMultiHash::contains(key, value)插入之前手动检查唯一对。

这两个事实都是Qt中的预期功能,这给程序员带来了强制执行唯一性的负担,而不是在每次插入时对性能进行检查。这就是C ++程序员应该从精心设计的类中获得的。

答案 1 :(得分:0)

不,你不会只回到Value*一次。每次调用插入时,您都会得到一份副本。 QMultiHash::values( key )将返回QList<Value*>,其中包含与QMultiHash::insert()调用相同数量的重复项。这是通过运行测试来确定会发生什么来确定的。

相关问题