从第一个中删除时,QVector :: remove(int i,int count)性能

时间:2014-03-19 07:46:14

标签: c++ qt qvector

我想像队列一样使用QVector。那是因为我想访问一个指向vector中数据的原始指针,而QVector连续放置数据。所以我将数据附加到我的QVector中的一个线程和另一个线程中读取第一个中的计数元素并将其删除。

当您从QVector的中间移除数据时,数据会重新排列并进行多次复制。我想知道在从QVector的乞讨中删除count元素时是否复制了数据,或者它的开销很小?有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用此课程来检查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 assign运算符被调用99次,并且当您删除最后一个元素时,它根本不被调用。

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

答案 1 :(得分:1)

问题在于您正在寻找一种数据结构,其中数据是连续存储的,同时您需要重新排列数据(即从前面删除元素)。除非您要删除向量中的所有元素,否则此操作将始终需要移动数据以使向量保持连续。

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