重复项的 QMultiHash insert() 行为

QMultiHash insert() behavior for duplicates

本文关键字:行为 insert QMultiHash      更新时间:2023-10-16

我有一个QMultiHash<Key, Value*> . 我可能每个Key有多个Value*,所以我确实想存储对应于每个Key的每个Value*,但我不想在key1 == key2 && value1 == value2多次的地方存储完全相同的重复项。

如果我使用哈希中已有的Key/Value*对调用QMultiHash::insert( Key, Value* ),它会添加第二个副本吗? 换句话说,如果我使用相同的Key/Value*对多次调用insert(),然后调用QMultiHash::values( Key )我会得到一次相同的Value*,还是会得到一个列表,其中Value*出现的次数与我调用插入的次数相同?

No. 根据定义,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++程序员应该对精心设计的类的期望。

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