2014-09-10 554 views
1

我使用QHash作为容器,我有一个任务来删除满足谓词的所有项目。 起初我以为使用Erase-remove idiom原来QHash没有选择删除范围,但只有一个function通过迭代器删除单个元素。从QHash中删除元素的范围

std :: unordered_map(它在概念上接近Qt的QHash)具有去除范围的function

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

+0

你如何定义*在unordered_map /哈希映射中的范围*? – 2014-09-10 09:16:24

+0

@PiotrS。基于它们的迭代器。例如std :: unordered_map :: iterator – alexolut 2014-09-10 09:49:13

+0

是的,但你如何定义它?满足条件的元素范围?在unordered_map中没有类似的东西,结果是定义了实现,因为unoredered_map中的元素没有排序(如名称所示) – 2014-09-10 09:50:31

回答

0

在评论的基础上,事实证明,擦除 - 删除成语不适用于QHash容器。

因此,鉴于QHash::erase的描述,特别是它不违反项目的顺序中的散列

与remove()方法,并采取(),这个函数永远不会导致QHash重提其内部数据结构。这意味着它可以在迭代时安全地调用,并且不会影响哈希中项目的顺序。

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

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