【问题标题】:How to initialize QVector如何初始化 QVector
【发布时间】:2014-01-22 21:15:04
【问题描述】:

我是 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),但我想了解什么是错误的以及如何纠正它。

【问题讨论】:

  • 构造函数中的 myVector(100) 就足够了
  • 我在for循环中,所以first()不会工作
  • 如果我这样做 myVector(100) 我得到错误:对非常量的引用的初始值必须是左值
  • @mFeinstein:显示 myVector 的声明。

标签: c++ qt qtcore qvector


【解决方案1】:

试试这样的:

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

void QVector::reserve(int size)

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

但这只会保留内存,如果要浏览,请使用fill(&lt;double&gt;)

【讨论】:

  • 正如我在问题中所说的那样,我想学习如何使用初始化列表来完成它,我知道我可以用指针逃脱......但无论如何还是谢谢
【解决方案2】:

您可能做错了一些未显示的事情,因为以下代码对我和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;
}

main.pro

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

输出

TEST FIRST: 0

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

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)
{
}

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

【讨论】:

  • 我搞砸了:PI 忘记了在 .h 中我试图将其作为参考,如 &amp;myVector,因此删除参考使其与我的原始代码一起使用,非常感谢
  • @mFeinstein:很高兴你修好了。请注意,这就是我要求声明的原因。
  • 是的,我忘了仔细检查声明
【解决方案3】:
QVector<double> * vect = new QVector<double>;
vect->resize(100);

void QVector::resize(int size) 将向量的大小设置为 size。如果 size 大于当前大小,则将元素添加到末尾;新元素使用默认构造的值进行初始化。如果 size 小于当前大小,则从末尾删除元素。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2019-05-17
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多