QVector::remove(int i, int count)从第一个对象移除时的性能

QVector::remove(int i, int count) performance when removing from the first

本文关键字:int 一个对象 性能 remove QVector count      更新时间:2023-10-16

我想使用像队列一样的QVector。这是因为我想访问一个原始指针的数据在矢量和QVector连续放置数据。所以我在一个线程的QVector中附加数据,在另一个线程中从第一个线程读取计数元素并删除它们。

当你从QVector的中间删除数据时,数据被重新排列,并且发生许多拷贝。我想知道当从QVector的乞求中删除计数元素时是否复制数据,或者它的开销很小?有更好的方法做这件事吗?

您可以使用这个类来检查QVector::remove的性能:

#include <QDebug>
class Dummy
{
public:
    Dummy()
    {
        qDebug() << "dummy ctor" << ++c1;
    }
    Dummy(const Dummy &d)
    {
        qDebug() << "dummy copy ctor" << ++c2;
    }
    Dummy &operator=(const Dummy &d)
    {
        qDebug() << "dummy asign" << ++c3;
    }
    static int c1, c2, c3;
};
int Dummy::c1 = 0;
int Dummy::c2 = 0;
int Dummy::c3 = 0;

测试本身:

int main(int argc, char *argv[])
{
    QVector<Dummy> v;
    for (int i = 0; i < 100; ++i)
    {
        v.append(Dummy());
    }
    qDebug() << "adding finished";
    v.remove(0);
    v.remove(v.size() - 1);
    qDebug() << "end";
        return 0;
}

在这个例子中,当你移除第一个元素时,Dummy的赋值运算符被调用99次,当你移除最后一个元素时,它根本不被调用。

无论如何,我想你有一些设计问题,如果你需要访问容器的原始数据。正如JKSH在注释中所说,您可以动态地为数据元素分配内存,然后将这些指针放入容器中。

问题是,您正在寻找数据连续存储的数据结构,同时,您需要重新排列数据(即从前面删除元素)。除非移除vector中的所有元素,否则该操作总是需要移动数据以保持vector连续。

我可以建议优化设计性能的一种方法(除了使用列表而不是向量和放弃指针访问)是编写一个自定义向量,其中删除第一个元素只是增加front指针,而不重新排列数据。这将具有与删除第一个元素相同的效果,但没有性能损失。您还必须实现一个清除例程,一旦达到移除元素的某个阈值,该例程将压缩vector,但是您可以控制何时执行此清理,而不是每次从队列中移除元素时都执行此清理。

相关文章: