Я использую QHash в качестве контейнера, и у меня есть задача удалить все элементы, которые удовлетворяют предикату.
Сначала я подумал использовать Стереть-удалить идиому оказалось, что QHash не имеет возможности удалить диапазон, а только функция удалить один элемент через итератор.
std :: unordered_map (концептуально близкий к QHash Qt) имеет функция удаления диапазона.
Это подразумевает вопрос: почему QHash не имеет подобной функции и как наилучшим образом удалить элементы из QHash, удовлетворяющие предикату?
На основании комментариев выясняется, что идиома erase-remove не применима к контейнеру QHash.
Поэтому, учитывая описание QHash :: Стирание, в частности, что это не нарушает порядок элементов в хэше
В отличие от remove () и take (), эта функция никогда не заставляет QHash перефразировать свою внутреннюю структуру данных. Это означает, что его можно безопасно вызывать во время итерации, и это не повлияет на порядок элементов в хэше.
у нас есть следующий код для удаления элементов, которые удовлетворяют предикату:
for( auto it = hash.begin(); it != hash.end(); ++it )
{
if( pred(*it) )
{
hash.erase(it);
}
}