在普通for循环中更改QVector的对象

Change object of a QVector in an ordinary for loop

本文关键字:QVector 对象 for 循环      更新时间:2023-10-16

如果我有一个QVector,我可以使用基于范围的循环,使用引用并更改QVector中的对象。

但是在修改对象时需要索引的情况下,我必须使用普通的for循环。但是我怎样才能改变QVector中对象的值呢?

作为解决方法,我在更改临时对象后使用了replace方法,但这有点难看。

这是代码:

struct Resource {
    int value = 0;
};
int main(int argc, char *argv[])
{
    QVector<Resource> vector{Resource{}, Resource{}, Resource{}};
    qDebug() << vector.at(0).value
             << vector.at(1).value
             << vector.at(2).value;
    for(Resource &res : vector)
        res.value = 1;
    qDebug() << vector.at(0).value
             << vector.at(1).value
             << vector.at(2).value;
    for(int i = 0; i < vector.size(); ++i) {
        //Resource &res = vector.at(i); <-- won't compile: cannot convert from 'const Resource' to 'Resource &'
        Resource &res = vector.value(i); //Compiles, but creates temporary Object and doesn't change the original object
        res.value = i;
        //vector.replace(res); <-- Workaround
    }
    qDebug() << vector.at(0).value
             << vector.at(1).value
             << vector.at(2).value;
}

使用数组下标操作符,[] .

Resource &res = vector[i];

或者您可以丢弃引用变量并直接访问:

vector[i].value = i;

该操作符返回指定索引处对象的非const引用。

您可以使用T & QVector::operator[](int i),因为它返回索引位置i的项作为可修改的引用。但是你现在使用的是const T & QVector::at(int i) const(即在两种情况下,你都有一个参考,但在operator[]的情况下,它不是常量)。

那么,你可以这样做:

for(int i = 0; i < vector.size(); ++i)
  vector[i].value = i;