Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QVector::从第一个服务器删除时的删除(int i,int count)性能_C++_Qt_Qvector - Fatal编程技术网

C++ QVector::从第一个服务器删除时的删除(int i,int 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,比如队列。这是因为我想访问一个指向vector中数据的原始指针,而QVector连续地放置数据。因此,我将数据附加到QVector中的一个线程和另一个线程中,从第一个线程读取count元素并移除它们


当您从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)几乎所有性能问题的答案都是“配置它”