2015-12-13 3 views
0

Я создал модель QListView, наследуя от QAbstractListModel и используя QVector в качестве внутреннего контейнера. Моя модель позволяет добавлять текст в конец списка, а также позволяет удалять элементы с фронта. Операции стирания переносятся (т. Е. Я стираю около 10% предметов с фронта каждый раз, когда список становится слишком большим).Что является наиболее подходящим контейнером Qt для QAbstractListModel и QListView

Что такое лучший контейнер для использования?

В настоящее время я использую QVector, так как я ожидаю, что производительность (смежная макет памяти) будет лучше в этом случае по сравнению с чем-то вроде QList. Однако я не уверен, что Qt обращается к контейнеру внутри и независимо от того, является ли контейнер непрерывным, имеет какое-либо значение.

+1

Вам нужно использовать контейнер Qt? Возможно, идеальным здесь является только стандартная библиотека 'std :: deque' библиотеки C++. 'QVector' очень похож на' std :: vector' и требует удаления во времени. 'QList' довольно похож на указатели хранения QVector, имеет фрагментацию памяти. Оба «QVector» и «QList» требуют линейного удаления, чтобы удалить элементы с фронта - это часть убийцы. Вам нужен контейнер, в котором как нажимной назад, так и поп-фронт являются постоянным временем и в идеале без связанной структуры, которая распределяет каждый узел отдельно. –

ответ

2

В большинстве подклассов QAbstractItemModel наиболее важным методом оптимизации является, как правило, data() (и index(), но это редко бывает проблемой): он будет называться gazillion раз, особенно если взгляды сверху отсортированы , Таким образом, копирование больших кусков данных из контейнера или выполнение непостоянного поиска времени, например. на карте - плохая идея. QVector/std :: vector - хороший стандартный выбор.

Таким образом, вы почувствуете, какие методы модели предметов называются как часто является хорошим упражнением, и могут добавлять некоторые счетчики и видеть.

Помимо быстрого поиска, я думаю, что выбор зависит в основном от того, как ваш ваш код изменяет контейнер, который не зависит от его использования внутри QAbstractItemModel. Qt не «обращается к контейнеру внутренне», весь доступ реализуется вами при внедрении data(), rowCount() и т. Д. Кроме того, в какой-то момент оптимизация контейнера больше также станет бессмысленной, поскольку представление, а не модель, станет узким местом.

+0

Оптимизация данных() имеет смысл, спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^