QVector::remove(int i, int count)从第一个对象移除时的性能
QVector::remove(int i, int count) performance when removing from the first
我想使用像队列一样的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,但是您可以控制何时执行此清理,而不是每次从队列中移除元素时都执行此清理。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值