2

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;
}
4

2 に答える 2

4

配列添字演算子 を使用します[]

Resource &res = vector[i];

または、参照変数を破棄して直接アクセスできます。

vector[i].value = i;

この演算子は、指定されたインデックスにあるオブジェクトへの非 const 参照を返します。

于 2015-10-06T14:26:17.473 に答える
2

を使用できます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;
于 2015-10-06T14:26:52.300 に答える