如何正确迭代QT的STL样式向量

时间:2017-10-12 15:17:48

标签: c++ qt iterator

我正在尝试迭代一个向量。

向量存储器初始化为最多可容纳10个元素

现在我分配了前3个元素并尝试在QT中使用STL样式迭代器打印它们。

#include <QDebug>

int main() {
    QVector<int> vv(10);
        vv[0] = 1;
        vv[1] = 2;
        vv[2] = 3;
        QVector<int>::iterator itt;
        for (itt = vv.begin(); itt != vv.end(); ++itt) {
            qDebug() << vv.at(*itt);
        }
}

输出很奇怪: 这不是1 2 3 而是它的2 3 0 1 1 1 1 1 1 1

为什么会这样?你能解释一下吗?

1 个答案:

答案 0 :(得分:0)

@NathanOliver指出您有两个问题:

  1. *itt已经是向量的元素,因此它应该只是qDebug() << *itt;
  2. 如果为每个向量索引创建一个特定大小的向量,则会创建该向量所保存类型的默认元素。这也是为什么没有默认构造函数的类型不能使用QVector之类的容器类的原因。在您的情况下,向量在创建时用1填充,因为1是int的默认值。然后,您只需覆盖前三个值即可。

我对您的代码还有其他担忧:

  1. 如果您希望向量仅保留与所添加的值一样多的值,为什么还要提供向量的长度? QVector非常有能力自己管理其存储。您只需使用QVector::appendQVector::operator<<来添加值,并且向量具有与您添加的值一样多的值。
  2. 为什么在这种情况下为什么要使用STL样式迭代器? QVectorIterator提供了一种方便的方法来迭代向量。它们还使代码更具可读性。

如果我是你,我将编写如下代码:

#include <QVector>
#include <QDebug>

int main() {
    QVector<int> numbers = QVector<int>() << 1 << 2 << 3;
    QVectorIterator<int> itNumbers(numbers);
    while (itNumbers.hasNext()) {
        qDebug() << itNumbers.next();
    }
}