Удалить диапазон элементов из QHash

Я использую QHash в качестве контейнера, и у меня есть задача удалить все элементы, удовлетворяющие предикату. Сначала я думал использовать идиому Erase-remove_idiom, но оказалось, что у QHash нет выбора для удаления диапазона, но только функция для удаления одного элемент через итератор.

std::unordered_map (который концептуально близок к QHash Qt) имеет функцию удаления диапазона.

Отсюда возникает вопрос: почему в QHash нет аналогичной функции и как лучше удалить элементы из QHash, удовлетворяющие предикату?


person αλεχολυτ    schedule 10.09.2014    source источник
comment
как вы определяете диапазон в unordered_map/hash map?   -  person Piotr Skotnicki    schedule 10.09.2014
comment
@ПиотрС. на основе их итераторов. например std::unordered_map::iterator   -  person αλεχολυτ    schedule 10.09.2014
comment
да, но как это определить? диапазон элементов, удовлетворяющих условию ? в unordered_map нет ничего подобного, результат определяется реализацией, потому что элементы в unoredered_map не упорядочены (как следует из названия)   -  person Piotr Skotnicki    schedule 10.09.2014
comment
@ПиотрС. Я знаю о неуказанном порядке в unordered_map (извините за тавтологию), но если у нас есть итераторы, мы могли бы иметь диапазон на их основе. Который можно передать в функцию std::unordered_map::erase. Но в QHash его нет. Почему?   -  person αλεχολυτ    schedule 10.09.2014
comment
поскольку это бесполезно, даже с unordered_map четко указано, что: (стирать) Обратите внимание, что контейнеры unordered_map не следуют какому-то определенному порядку для организации своих элементов, поэтому эффект удаления диапазона может быть трудно предсказуем. >   -  person Piotr Skotnicki    schedule 10.09.2014
comment
@ПиотрС. Можете ли вы ответить на вторую часть исходного вопроса, как наилучшим образом удалить элементы из QHash, удовлетворяющие предикату, особенно если у нас нет версии функции стирания для диапазона?   -  person αλεχολυτ    schedule 10.09.2014
comment
RTFM   -  person D Drmmr    schedule 10.09.2014


Ответы (1)


На основе комментариев выясняется, что идиома «стереть-удалить» не применима к контейнеру QHash.

Поэтому, учитывая описание QHash::erase, в особенно то, что он не нарушает порядок элементов в хэше

В отличие от remove() и take(), эта функция никогда не заставляет QHash перефразировать свою внутреннюю структуру данных. Это означает, что его можно безопасно вызывать во время итерации, и он не повлияет на порядок элементов в хэше.

у нас есть следующий код для удаления элементов, удовлетворяющих предикату:

for( auto it = hash.begin(); it != hash.end(); ++it )
{
    if( pred(*it) )
    {
        hash.erase(it); 
    }
}
person αλεχολυτ    schedule 10.09.2014