如何初始化 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) 但我想知道什么是错的以及如何使它正确。

原文由 Michel Feinstein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

您可能在做一些未显示的错误,因为以下代码对我来说很好,而且 它应该是设计使然。请注意,对于第一个元素,您可以使用便捷的 第一方法

主文件

#include <QVector>
#include <QDebug>

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

主程序

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

输出

TEST FIRST: 0

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

void QVector::reserve(int size)

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

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

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

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

但是,正如我在评论后面提到的那样,简单的构造函数也应该像这样工作:

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

您正在做的是调用复制构造函数(尽管对于隐式共享类),因此它的速度可能可以忽略不计。它至少比您需要的代码多。

原文由 László Papp 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试这样的事情:

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

void QVector::reserve(int size)

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

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

原文由 Thomas Ayoub 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题