在普通的 for 循环中更改 QVector 的对象
Change object of a QVector in an ordinary for loop
如果我有 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;
此运算符 returns 对指定索引处对象的非常量引用。
您可以使用 T & QVector::operator[](int i)
,因为它 returns 索引位置 i
的项目作为可修改的引用。但是您现在正在使用 const T & QVector::at(int i) const
(即在这两种情况下您都有一个参考,但在 operator[]
的情况下它不是常数)。
所以,你可以这样做:
for(int i = 0; i < vector.size(); ++i)
vector[i].value = i;
如果我有 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;
此运算符 returns 对指定索引处对象的非常量引用。
您可以使用 T & QVector::operator[](int i)
,因为它 returns 索引位置 i
的项目作为可修改的引用。但是您现在正在使用 const T & QVector::at(int i) const
(即在这两种情况下您都有一个参考,但在 operator[]
的情况下它不是常数)。
所以,你可以这样做:
for(int i = 0; i < vector.size(); ++i)
vector[i].value = i;