我发现std :: sort非常慢,只能排序1000个项目。
在类模板template <typename T> class TableModel : public QAbstractTableModel
中,我有以下函数对表进行排序。
template<typename T>
void TableModel<T>::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) {
if(order == Qt::AscendingOrder) {
qSort(m_list.begin(), m_list.end(), less<T>(column));
} else {
qSort(m_list.begin(), m_list.end(), greater<T>(column));
}
reset();
}
我注意到如果我只是随机洗牌我的桌子是随机播放然后立即显示。所以这让我觉得它的那种缓慢。任何人都可以帮助我加快QTable的分类吗?
这是较少的结构。
template<typename T>
struct less {
int index;
less(int index) : index(index) {}
bool operator()(const T& first, const T& second) {
return T::less(first, second, index);
}
};
T :: less是一个函数,它所做的全部都比基于给定索引的比较少。
当我需要在以后处理大约100,000件物品时,只有1000件物品被定义为5秒。
答案 0 :(得分:2)
我怀疑m_list
按值存储项目并且交换它们很昂贵。您可以尝试实现更快的交换,或者通过智能指针将它们存储在容器中。
当然,分析器可以帮助您更准确地查明问题。
答案 1 :(得分:1)
由于m_list是QList,因此它不具有与普通列表相同的接口或性能特征。例如,显然QList在内部存储T *数组。如果排序算法知道此实现细节,则可以对该表示进行排序而无需任何复制。相比之下,std :: sort可能会深深地复制周围的值,或者可能会移动它们,这比排序QList数组中的指针要多得多。
最好将Qt容器与Qt算法一起使用,因为Qt算法更可能专门用于Qt容器。或者你可以避免使用Qt容器,只需坚持使用标准库。
无论如何,尝试使用Qt的qSort
算法:
template<typename T>
void TableModel<T>::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) {
if(order == Qt::AscendingOrder) {
qSort(m_list.begin(), m_list.end(), less<T>(column));
} else {
qSort(m_list.begin(), m_list.end(), greater<T>(column));
}
reset();
}
std :: sort无法利用列表中的节点可以移动而不复制元素的事实。假设您正在使用std :: list或类似的东西,请使用排序成员函数。
template<typename T>
void TableModel<T>::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) {
std::random_shuffle(m_list.begin(), m_list.end());
if(order == Qt::AscendingOrder) {
m_list.sort(less<T>(column));
} else {
m_list.sort(greater<T>(column));
}
reset();
}
如果您不能这样做,那么您可以通过确保在使用C ++ 11时启用移动元素来优化所有这些副本。