diff options
author | Anton Kudryavtsev <a.kudryavtsev@netris.ru> | 2016-02-17 12:26:43 +0300 |
---|---|---|
committer | Anton Kudryavtsev <a.kudryavtsev@netris.ru> | 2016-02-24 08:06:32 +0000 |
commit | ad9340de99a9961a8d34c7e430638a7c01c3d2be (patch) | |
tree | b41f698c3353e5ead9d7a17c8b0cf07314f89c6f | |
parent | d392826959257c9e407fb32d1de62b0b56a2c052 (diff) |
QListView: avoid quadratic complexity in selectedIndexes().
Use std::remove_if(), which is linear, instead of looping
over erase(it), which turns the loop quadratic.
Reorder condition: call cheap non-virtual QModelIndex::column()
first, then virtuals parent(), and isIndexHidden().
Change-Id: Id46ee1297b91906332eeca98f69372ef887ac330
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Edward Welbourne <edward.welbourne@theqtcompany.com>
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 8e4d94d2f0..646ab58e3d 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -1440,13 +1440,11 @@ QModelIndexList QListView::selectedIndexes() const return QModelIndexList(); QModelIndexList viewSelected = d->selectionModel->selectedIndexes(); - for (int i = 0; i < viewSelected.count();) { - const QModelIndex &index = viewSelected.at(i); - if (!isIndexHidden(index) && index.parent() == d->root && index.column() == d->column) - ++i; - else - viewSelected.removeAt(i); - } + auto ignorable = [this, d](const QModelIndex &index) { + return index.column() != d->column || index.parent() != d->root || isIndexHidden(index); + }; + viewSelected.erase(std::remove_if(viewSelected.begin(), viewSelected.end(), ignorable), + viewSelected.end()); return viewSelected; } |