如何初始化QVector

时间:2014-01-05 12:24:25

标签: c++ qt qtcore qvector

我是c ++和Qt的新手,我正在尝试初始化一个QVector,它是类初始化列表中的类成员,如:

MyClass::MyClass(QWidget *parent) : QMainWindow(parent) , myVector(QVector<double>(100))

我期待QVector已经有100个索引,但是当我尝试读取myVector[0]时,我得到一个断言错误,说“test.exe中的0x0143bf77处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。 “程序停在Qt的这一行:

inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
  return data()[i]; }

我相信这表明我正在尝试访问尚未分配的成员,所以我想我没有正确使用初始化列表。我可以把它作为一个指针并在构造函数中创建一个new QVector(100),但我想知道什么是错的,我怎么能让它正确。

2 个答案:

答案 0 :(得分:11)

你可能做错了,因为下面的代码对我来说很合适,it should by design。请注意,对于第一个元素,您可以使用方便first method

的main.cpp

#include <QVector>
#include <QDebug>

int main()
{
    QVector<double> myVector(QVector<double>(100));
    qDebug() << "TEST FIRST:" << myVector.first();
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
SOURCES += main.cpp

输出

TEST FIRST: 0

正如我在评论中指出的那样,您可以使用reserve method

  

void QVector :: reserve(int size)

     

尝试为至少大小的元素分配内存。如果你事先知道向量的大小,你可以调用这个函数,如果你经常调用resize(),你可能会获得更好的性能。如果大小被低估,那么最糟糕的情况是QVector会慢一些。

     

此功能的唯一目的是提供一种微调QVector内存使用的方法。通常,您很少需要调用此函数。如果要更改向量的大小,请调用resize()。

所以,你会写这样的东西:

MyClass::MyClass(QWidget *parent)
    : QMainWindow(parent)
{
    myVector.reserve(100);
}

然而,正如我后面在评论中所述,简单的构造函数也应该像:

MyClass::MyClass(QWidget *parent)
    : QMainWindow(parent)
    , myVector(100)
{
}

您正在做的是调用复制构造函数(虽然对于隐式共享类),因此它可能会慢得忽视。这至少是你需要的代码。

答案 1 :(得分:1)

尝试这样的事情:

QVector<double> * vect = new QVector<double>;
vect->reserve(100);

void QVector :: reserve(int size)

尝试为至少大小的元素分配内存。如果你事先知道向量的大小,你可以调用这个函数,如果你经常调用resize(),你可能会获得更好的性能。如果大小被低估,那么最糟糕的情况是QVector会慢一点。 此功能的唯一目的是提供一种微调QVector内存使用的方法。通常,您很少需要调用此函数。如果要更改向量的大小,请调用resize()。

但这只会保留内存,如果你想浏览它,请使用fill(<double>)