gpt4 book ai didi

c++ - 如何初始化QVector

转载 作者:可可西里 更新时间:2023-11-01 15:55:10 31 4
gpt4 key购买 nike

我是 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),但我想了解哪里出了问题以及我如何才能使其更正。

最佳答案

你可能做错了未显示的事情,因为以下代码对我来说工作正常,并且 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;
}

主程序

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

输出

TEST FIRST: 0

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

void QVector::reserve(int size)

Attempts to allocate memory for at least size elements. If you know in advance how large the vector will be, you can call this function, and if you call resize() often you are likely to get better performance. If size is an underestimate, the worst that will happen is that the QVector will be a bit slower.

The sole purpose of this function is to provide a means of fine tuning QVector's memory usage. In general, you will rarely ever need to call this function. If you want to change the size of the vector, call resize().

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

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

但是,正如我稍后在评论中指出的那样,简单的构造函数也应该像这样工作:

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

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

关于c++ - 如何初始化QVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20933509/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com