2

我使用 QHash 作为容器,我的任务是删除所有满足谓词的项目。起初我想使用Erase-remove 习惯用法,结果发现 QHash 没有删除范围的选项,而只有一个通过迭代器删除单个元素的函数

std::unordered_map(概念上接近Qt的QHash)具有去除范围的功能

这意味着一个问题:为什么 QHash 没有类似的功能以及如何从满足谓词的 QHash 中删除项目的最佳方式?

4

2 回答 2

1

根据评论,事实证明,erase-remove 习语不适用于 QHash 容器。

因此,给定QHash::erase的描述,特别是它不违反哈希中项目的顺序

与 remove() 和 take() 不同,此函数不会导致 QHash 重新散列其内部数据结构。这意味着它可以在迭代时安全地调用,并且不会影响哈希中项目的顺序。

我们有以下代码来删除满足谓词的元素:

for( auto it = hash.begin(); it != hash.end(); )
{
    if( pred(*it) )
    {
        it = hash.erase(it); 
    } else {
        ++it;
    }
}
于 2014-09-10T10:58:18.377 回答
0

接受的答案不起作用,因为它忽略了来自 erase() 的返回值,它是哈希中下一项的迭代器。你需要做的;

QHash<QObject *, int> objectHash;
QHash<QObject *, int>::iterator i = objectHash.begin();
while (i != objectHash.end()) {
    if (i.value() == 0) {         // test here
        i = objectHash.erase(i);
    } else {
    ++i;
}

根据 Qt 文档链接 - 否则您将增加一个无效的迭代器。

于 2022-01-04T15:24:01.450 回答