从QHash中移除一系列元素



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

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

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

根据注释,擦除-删除习惯用法不适用于QHash容器。

因此,给出了QHash::擦除的描述,特别是它不违反散列中项目的顺序

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

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

for( auto it = hash.begin(); it != hash.end(); )
{
    if( pred(*it) )
    {
        it = hash.erase(it); 
    } else {
        ++it;
    }
}

接受的答案不起作用,因为它忽略了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文档链接-否则您将增加一个无效的迭代器。

相关内容

  • 没有找到相关文章

最新更新