c++ - QVector::remove(int i, int count) 从第一个移除时的性能

标签 c++ qt qvector

我想像队列一样使用 QVector。那是因为我想访问一个指向 vector 中数据的原始指针,而 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 在评论中所说,您可以为数据元素动态分配内存,然后将这些指针放入容器中。

关于c++ - QVector::remove(int i, int count) 从第一个移除时的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22499363/

相关文章:

c++ - 初始化并访问<QVector< QVector<int>> QT5

c++ - boost::posix_time::time_input_facet 可以处理非标准的小数秒分隔符吗?

c++ - 使用 QVector 和 Qt 创建二维的 QString 数组

c++ - 从混合整数、字母和空格的文件中读取整数 C++

c++ - Qt 在事件中显示不同的场景

c++ - Qt: "No such signal"错误

java - 将java方法转换为cpp

c++ - 有没有办法将 QVariant 与 QVector 一起使用?

C++ typedef 函数定义作为类成员以便稍后用于函数指针?

c++ - OpenGL - 每次单击菜单时对象移动