2015-10-06 50 views
0

如果我有QVector,我可以使用基於範圍的循環,請使用引用並更改QVector中的對象。在普通for循環中更改QVector的對象

但在修改對象時我需要索引的情況下,我必須使用普通的for循環。但是,我怎樣才能改變QVector中對象的值?

解決方法在更改臨時對象之後,我使用了替換方法,但這很醜陋。

這是代碼:

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

回答

3

使用數組下標操作者,[]

Resource &res = vector[i]; 

,或者你可以放棄引用變量,做一個直接訪問:

vector[i].value = i; 

這個操作符返回指定索引處非const對象的引用。

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;