QMap::contains() не возвращает ожидаемое значение

У меня есть класс, содержащий объект QMap:

QMap<QString, Connection*> users;

Теперь в следующей функции Foo() предложение if всегда возвращает false, но когда я перебираю карту, в ключах присутствует сравниваемая QString, т. е. str1.

void Foo(QString& str1, QString& str2)
{    
    if(users.contains(str1))
        users[str1]->doStuff(str2);
    else
    {
        for(QMap<QString, Connection>::iterator iter = users.begin(); 
                           iter!= users.end();iter++)
            qDebug()<<iter.key();
    }
}

Я делаю что-то неправильно? Почему не contains() возвращает true?


person Saurabh Manchanda    schedule 21.10.2010    source источник
comment
В вашем вопросе есть опечатка? Вы говорите, что в ключах присутствует str2, но вы проверяете, содержит ли users str1.   -  person Steve S    schedule 21.10.2010
comment
Я сделал необходимое редактирование.   -  person Saurabh Manchanda    schedule 21.10.2010


Ответы (1)


С юникодом две строки могут отображаться одинаково, но на самом деле быть разными. Предполагая, что это так, вы захотите сначала нормализовать строки. :

str = str.normalize(QString::NormalizationForm_D);
if (users.contains(str))
    // do something useful

Конечно, вам нужно нормализовать строку, прежде чем вы поместите ее в свою карту пользователей.

person Kaleb Pederson    schedule 21.10.2010
comment
Даже после нормализации QString перед сохранением в QMap и перед проверкой, contains() возвращает только false. - person Saurabh Manchanda; 21.10.2010
comment
Пожалуйста, покажите нам, чем отличаются строки. Например, qDebug() << str.toUtf8() должен показать нам фактические байты, которые создают строку. - person Kaleb Pederson; 21.10.2010
comment
После очистки проекта и пересборки все заработало. Спасибо. - person Saurabh Manchanda; 21.10.2010