2013-08-17 7 views
3

У меня есть QHash<QString, QVector<float> > qhash, и пытается overwite значения в QVector следующим образом:QHash из QVectors

void Coordinate::normalizeHashElements(QHash<QString, QVector<float> > qhash) 
{ 
    string a = "Cluster"; 
    float new_value; 
    float old_value; 
    const char *b = a.c_str(); 
    float min = getMinHash(qhash); 
    float max = getMaxHash(qhash); 

    QHashIterator<QString, QVector<float> > i(qhash); 
     while (i.hasNext()) 
     { 
      i.next(); 
      if(i.key().operator !=(b)) 
      { 
       for(int j = 0; j<i.value().size(); j++) 
       { 
        old_value = i.value().at(j); 
        new_value = (old_value - min)/(max-min)*(0.99-0.01) + 0.01; 
        i.value().replace(j, new_value); 
       } 
      } 
     } 
} 

Я получаю сообщение об ошибке на i.value().replace(j, new_value); инсультом высказывании следующее:

C:\Qt\latest test\Prototype\Coordinate.cpp:266: error: passing 'const QVector' as 'this' argument of 'void QVector::replace(int, const T&) [with T = float]' discards qualifiers [-fpermissive]

может кто-нибудь Помогите мне исправить это?

ответ

3

В сообщении об ошибке сообщается, что вы пытаетесь использовать метод const для экземпляра const. В этом случае вы пытаетесь позвонить QVector::replace по телефону const QVector. Основная причина этого заключается в том, что вы используете QHashIterator, который возвращает const ссылки от QHashIterator::value().

Чтобы исправить это, вы можете использовать итератор в стиле STL вместо итератора Java-стиле на QHash:

QString b("Cluster"); 
QHash<QString, QVector<float> >::iterator it; 
for (it = qhash.begin(); it != qhash.end(); ++it) 
{ 
    if (it.key() != b) 
    { 
     for (int j=0; i<it.value().size(); j++) 
     { 
     old_value = it.value().at(j); 
     new_value = (old_value-min)/(max-min)*(0.99-0.01) + 0.01; 
     it.value().replace(j, new_value); 
     } 
    } 
} 

Вы также можете использовать QMutableHashIterator вместо QHashIterator.

+0

Большое спасибо за ваш ответ. Я попробую и отправлю отзыв, как только закончу. – SuTron

+0

Благодарим вас за ценный ответ. Это сработало для меня! – SuTron

+0

@MikaelEgibyan Добро пожаловать. Не забудьте принять полезные ответы: http://stackoverflow.com/help/accepted-answer :-) –