Как инициализировать 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>)