2015-10-06 3 views
0

Если у меня есть QVector, я могу использовать цикл на основе диапазона, использовать ссылку и изменить объекты в QVector.Измените объект QVector в обычном для цикла

Но в случае, когда мне нужен индекс при изменении объекта, я должен использовать обычный цикл. Но как я могу изменить значение объекта в 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; 

Этот оператор возвращает не константную ссылку на объект по указанному индексу.

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;