C++ QVector::从第一个服务器删除时的删除(int i,int count)性能
我想使用QVector,比如队列。这是因为我想访问一个指向vector中数据的原始指针,而QVector连续地放置数据。因此,我将数据附加到QVector中的一个线程和另一个线程中,从第一个线程读取count元素并移除它们C++ QVector::从第一个服务器删除时的删除(int i,int count)性能,c++,qt,qvector,C++,Qt,Qvector,我想使用QVector,比如队列。这是因为我想访问一个指向vector中数据的原始指针,而QVector连续地放置数据。因此,我将数据附加到QVector中的一个线程和另一个线程中,从第一个线程读取count元素并移除它们 当您从QVector的中间移除数据时,数据会重新排列,并产生许多副本。我想知道在从QVector的请求中删除计数元素时是否复制了数据,或者数据的开销很小?有更好的方法吗?您可以使用此类检查QVector::remove性能: #include <QDebug>
当您从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;
#包括
类虚拟
{
公众:
伪()
{
qDebug()您可以使用此类检查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;
#包括
类虚拟
{
公众:
伪()
{
qDebug()问题在于,您正在寻找一种数据结构,其中数据连续存储,同时需要重新排列数据(即从前面删除元素)。除非删除向量中的所有元素,否则此操作将始终需要移动数据以保持向量连续
我可以推荐一种优化设计性能的方法(除了使用列表而不是向量以及放弃指针访问)是编写一个自定义向量,其中删除第一个元素只会增加前端
指针,而不会重新排列数据。这将与删除第一个元素具有相同的效果,但不会造成性能损失。您还必须实现一个清理例程,该例程将在达到某个阈值后压缩向量已删除的元素已到达,但您可以控制何时执行此清理,而不是每次从队列中删除时都执行此清理。问题在于,您正在寻找一个数据结构,其中数据连续存储,同时需要重新排列数据(即从前端删除元素)。除非删除向量中的所有元素,否则此操作将始终需要移动数据以保持向量连续
我可以推荐一种优化设计性能的方法(除了使用列表而不是向量以及放弃指针访问)是编写一个自定义向量,其中删除第一个元素只会增加前端
指针,而不会重新排列数据。这将与删除第一个元素具有相同的效果,但不会造成性能损失。您还必须实现一个清理例程,该例程将在达到某个阈值后压缩向量删除的元素已到达,但您可以控制何时执行此清理,而不是每次从队列中删除时都执行清理。QVector
不是为队列元素设计的,您应该将数据包装在QQueue
中,但我不能通过指针访问QQueue中的数据。通过指针访问什么?正如我在您的Another中所说的那样r问题-你应该阅读一些关于数据结构及其复杂性的内容。如果你需要通过索引进行快速访问,你应该使用QVector,如果你需要快速插入/删除,你应该使用QLinkedList。但在大多数情况下,使用QList就够了。你最初的问题是什么?你在哪里遇到性能问题?你如何分析它们?(1)为什么您需要一个指向容器中原始数据的指针?您可以只堆分配数据,并将它们的指针存储在容器中。(2)几乎所有性能问题的答案都是“配置它”QVector
不是为排队元素设计的,你应该将数据包装在QQueue
中,但我不能通过指针访问QQueue中的数据。通过指针访问什么?正如我在你的另一个问题中所说的,你应该阅读一些关于数据结构及其复杂性的内容。如果你需要通过索引快速访问,你应该使用QVector,如果你需要的话您需要快速插入/删除。您应该使用QLinkedList。但在大多数情况下,使用QList就足够了。您最初的问题是什么?哪里有性能问题?如何分析它们?(1)为什么需要指向容器中原始数据的指针?您可以只堆分配数据,并将它们的指针存储在容器中。(2)几乎所有性能问题的答案都是“配置它”