如何初始化QVector
How to initialize 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)
,但我想了解哪里出了问题,以及如何纠正它。
您可能在unshow中做了一些错误的事情,因为下面的代码对我来说很好,而且应该是经过设计的。请注意,对于第一个元素,可以使用方便优先的方法。
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
正如我在评论中指出的,你可以使用保留方法。
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)
{
}
您正在做的是调用复制构造函数(尽管是针对隐式共享类),因此它的速度可能慢得可以忽略不计。它至少比您需要的代码更多。
试试这样的东西:
QVector<double> * vect = new QVector<double>;
vect->reserve(100);
void QVector::reserve(int size)
尝试为至少size的元素分配内存。如果你事先知道向量有多大,你可以调用这个函数,如果你经常调用resize(),你可能会得到更好的性能。如果低估了大小,那么最糟糕的情况是QVector会慢一点。此函数的唯一目的是提供一种微调QVector内存使用情况的方法。通常,您很少需要调用此函数。如果要更改矢量的大小,请调用resize()
但这只会保留内存,如果你想浏览它,请使用fill(<double>)
QVector<double> * vect = new QVector<double>;
vect->resize(100);
void QVector::resize(int size)将矢量的大小设置为大小。如果大小大于当前大小,则元素将添加到末尾;使用默认构造值对新元素进行初始化。如果大小小于当前大小,则将从末端删除元素。
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 如何初始化QVector
- 如何用new初始化QVector<QVector<QString>>*矩阵(作为类成员)?
- 从数组初始化QVector