Как инициализировать QVector
Я новичок в c++ и Qt, и я пытаюсь инициализировать QVector, который является членом класса в списке инициализации класса, например:
MyClass::MyClass(QWidget *parent) : QMainWindow(parent) , myVector(QVector<double>(100))
Я ожидал, что QVector будет иметь уже 100 индексов, но когда я пытаюсь прочитать myVector[0]
Я получаю сообщение об ошибке утверждения " необработанное исключение в 0x0143bf77 в тесте.exe: 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 ответов
вы, вероятно, делаете что-то неправильно, потому что следующий код отлично работает для меня, и он должен по своей конструкции. Обратите внимание, что для первого элемента, вы можете использовать удобства первый способ.
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
как я отметил в комментарии, вы можете использовать резервный метод.
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)
пытается выделить память по крайней мере для элементов размера. Если вы заранее знаете, насколько велик вектор, вы можете вызвать эту функцию, и если вы вызываете resize() часто, вы, вероятно, получите лучшую производительность. Если размер недооценен, худшее, что произойдет, - это то, что QVector будет немного медленнее. Единственная цель этой функции-обеспечить средства тонкой настройки использования памяти QVector. В общем, вам редко когда-либо понадобится вызывать эту функцию. Если вы хотите изменить размер вектора, вызовите resize().
но это только зарезервирует память, если вы хотите просмотреть ее, используйте fill(<double>)