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

Posted

技术标签:

【中文标题】在普通 for 循环中更改 QVector 的对象【英文标题】:Change object of a QVector in an ordinary for loop 【发布时间】:2015-10-06 14:20:56 【问题描述】:

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

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

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

这是代码:

struct Resource 
    int value = 0;
;

int main(int argc, char *argv[])

    QVector<Resource> vectorResource, 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;

【问题讨论】:

【参考方案1】:

使用数组下标运算符[]

Resource &res = vector[i];

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

vector[i].value = i;

此运算符返回对指定索引处对象的非常量引用。

【讨论】:

【参考方案2】:

您可以使用T &amp; QVector::operator[](int i),因为它会将索引位置i 处的项目作为可修改引用返回。但是您现在正在使用const T &amp; QVector::at(int i) const(即在这两种情况下您都有参考,但在operator[] 的情况下它不是恒定的)。

所以,你可以这样做:

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

【讨论】:

以上是关于在普通 for 循环中更改 QVector 的对象的主要内容,如果未能解决你的问题,请参考以下文章

前端笔记十一v-for循环普通数组对象数组对象数字

前端笔记十一v-for循环普通数组对象数组对象数字

前端笔记十一v-for循环普通数组对象数组对象数字

如何以简单的方式更改堆上 QVector 数组中包含的对象的值?

Vue.js v-for 循环绑定数组中的项目对象并在更改时更新

淘汰 JS $parent 对象在 for-each 循环中更改其信息