QAbstractListModel 和 QListView 最合适的 Qt 容器是什么

What is the most appropriate Qt container for QAbstractListModel and QListView

我通过继承自 QAbstractListModel 并使用 QVector 作为内部容器创建了一个 QListView 模型。我的模型只允许将文本附加到列表的后面,也只允许从前面删除项目。擦除操作是分批处理的(即每次列表太大时,我都会从前面擦除大约 10% 的项目)。

最好使用什么容器?

目前我正在使用 QVector,因为我希望在这种情况下性能(连续内存布局)比 QList 更好。然而,我不确定 Qt 如何在内部访问容器以及容器是否连续有什么不同。

在大多数 QAbstractItemModel 子类中,最重要的优化方法通常是 data()(和 index(),但这很少有问题):它将被调用无数次,尤其是当顶部的视图进行排序时启用。因此,从容器中复制大块数据或进行非恒定时间查找,例如在地图上是个坏主意。 QVector/std::vector 是一个很好的标准选择。

所以了解哪些项目模型方法被调用的频率是一个很好的练习,并且可以添加一些计数器看看。

除了快速查找之外,我认为选择主要取决于你的代码如何修改容器,这与它在 QAbstractItemModel 中的使用无关。 Qt 不会 "access the container internally",所有访问都由您实现,因为您实现了 data()、rowCount() 等。此外,在某些时候优化容器也将变得毫无意义,因为视图,而不是模型, 将成为瓶颈。