QLinkedList operator+ 效率

Posted

技术标签:

【中文标题】QLinkedList operator+ 效率【英文标题】:QLinkedList operator+ efficiency 【发布时间】:2013-06-21 17:13:39 【问题描述】:

我发现自己经常连接 QLinkedLists,所以我开始担心 Qt 的 QLinkedList::operator+( const QLinkedList<T> &other ) const 的效率

我试图查找operator+ 的源代码,但我无法理解它。我已经在 a different question 寻求帮助。

使用operator+() 运算符连接两个相同类型的QLinkedLists 是否有效?实现是否只是让迭代器从第一个列表跳到第二个列表,所以调用operator+()?基本上没有惩罚

【问题讨论】:

【参考方案1】:

这是我发现的:

template <typename T>
QLinkedList<T> QLinkedList<T>::operator+(const QLinkedList<T> &l) const

    QLinkedList<T> n = *this;
    n += l;
    return n;

所以它会复制整个列表,使用 operator+=() 并返回新列表。对于 const 方法,它非常简单。

但我确实有顾虑:

如果您尝试合并大型列表...我个人会使用 std::list 代替。换句话说,在很多情况下,您不需要保留两个列表(子集)的副本,这就是惩罚所在。

QList a, b, c;
// ... etc.. assumes a & b grow to great sizes
c = a + b;

从上面的示例中,如果您需要保留 a 和 b,那么从子集创建新列表显然是必要的成本。但是,如果您在创建列表 c 之后不需要 a & b ......那么使用 operator+ 并不是最佳选择。当然 - 对于非常小的列表,这都是微不足道的。

similar to QLinkedList 的 std::list 容器。

对于 std::list,我会使用 splice to merge two lists together 之类的东西。对于QLinkedList,我找不到类似的东西,但就像我已经说过的,我确实倾向于在我自己的代码中使用 STL 容器。

【讨论】:

以上是关于QLinkedList operator+ 效率的主要内容,如果未能解决你的问题,请参考以下文章

QList/QLinkedList 的迭代器是永久的吗? [复制]

operator++()实现:前置++和后置++

QT软件开发之入门基础--1.7 容器类

[Hdu6315]Naive Operations

尝试从帧缓冲区传递纹理会导致 L_INVALID_OPERATION:glDrawArrays:绘制的源纹理和目标纹理相同

hdu 6579 Operation (在线线性基)