Russian Qt Forum
Октябрь 05, 2024, 10:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QHash ключ без учета регистра  (Прочитано 4351 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 08, 2011, 20:51 »

Добрый день

Как лучше (проще, изящнее, техничнее и.т.п.) сделать такую простую вещь
Код
C++ (Qt)
QHash <QString, int> theHash;
 
theHash["First"] = 1;
theHash["first"] = 2;
 
Так будут вставлены 2 элемента - а как сделать чтобы 1 (если ключи равны без учета регистра)?

Спасибо
Записан
twp
Гость
« Ответ #1 : Август 08, 2011, 21:16 »

Делал подобное, но просто у меня не получилось, не  знаю как на счет изящнее  Улыбающийся создал свой класс строки наследованный от QString просто для того чтоб была своя хеш функция:
Код:
inline uint qHash(const MyString &key)
{ return ::qHash(key.toUpper()); }

ну потом прицепом еще некоторые контейнеры пришлось переопределить
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Август 08, 2011, 21:20 »

Может, лучше boost::hash заюзать?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 08, 2011, 21:34 »

ну потом прицепом еще некоторые контейнеры пришлось переопределить
Та отож, потом все время придется "переливать", накручивать операторы и.т.п.

Может, лучше boost::hash заюзать?
Так это ж
Код:
Не имеет к Qt никакого отношения
Улыбающийся
Может bug report/feature request сбацаем? (English я возьму на себя)
Записан
twp
Гость
« Ответ #4 : Август 08, 2011, 21:38 »

собственно кода оказалось не много, думал было больше. Просто для той задачи что нужно было сделать, этого было достаточно

Код:
class MyString : public QString
{
public:
    MyString() {}
    MyString(const MyString &other) : QString(other) {}
    MyString(const QString &other) : QString(other) {}
};

inline bool operator<(const MyString &s1, const MyString &s2)
{ return s1.toUpper() < s2.toUpper(); }
inline bool operator==(const MyString &s1, const MyString &s2)
{ return !s1.compare(s2, Qt::CaseInsensitive); }

inline uint qHash(const MyString &key)
{ return ::qHash(key.toUpper()); }

typedef QList<MyString> MyList;
typedef QSet<MyString>  MySet;


class MyStringList : public QStringList
{
public:
    MyStringList() {}
    MyStringList(const MyStringList &other) : QStringList(other) {}
    MyStringList(const MyList &other)
    {
        foreach (const MyString &str, other)
            append(str);
    }
};


template <class T>
class MyHash : public QHash<MyString, T>
{
public:
    inline QStringList keys() const
    { return MyStringList(QHash<MyString, T>::keys()); }
};


template <class T>
class MyMap : public QMap<MyString, T>
{
public:
    inline QStringList keys() const
    { return MyStringList(QMap<MyString, T>::keys()); }
};
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 08, 2011, 21:41 »

Вот мне не нравится, что в Qt ушли от передачи своей функции сравнения, хеширования при создании контейнера. Грустный
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 22.