From 492cfb73a370e03acc0561a631ce7e0d606ddf58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=BCns?= Date: Mon, 15 Feb 2021 17:40:17 +0100 Subject: [PATCH] [FileItemRolesUpdater] Use STL-style iterator instead of iterating a copy QSet::erase(it) is the save way of erasing from a QSet while iterating it. This saves creating a copy of the QSet, lookup of a node by value in `QSet::remove(item)`, and repeated rehashing caused by `remove`. --- src/kitemviews/kfileitemmodelrolesupdater.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index d18387f512..46176638e9 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -957,15 +957,17 @@ void KFileItemModelRolesUpdater::updateChangedItems() visibleChangedIndexes.reserve(m_changedItems.size()); invisibleChangedIndexes.reserve(m_changedItems.size()); - // Iterate over a const copy because items are deleted within the loop - const auto changedItems = m_changedItems; - for (const KFileItem &item : changedItems) { + auto oldsize = m_changedItems.size(); + auto changedItemsIt = m_changedItems.begin(); + while (changedItemsIt != m_changedItems.end()) { + const auto& item = *changedItemsIt; const int index = m_model->index(item); if (index < 0) { - m_changedItems.remove(item); + changedItemsIt = m_changedItems.erase(changedItemsIt); continue; } + ++changedItemsIt; if (index >= m_firstVisibleIndex && index <= m_lastVisibleIndex) { visibleChangedIndexes.append(index);