Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Август 08, 2011, 20:51



Название: QHash ключ без учета регистра
Отправлено: Igors от Август 08, 2011, 20:51
Добрый день

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

Спасибо


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

ну потом прицепом еще некоторые контейнеры пришлось переопределить


Название: Re: QHash ключ без учета регистра
Отправлено: Пантер от Август 08, 2011, 21:20
Может, лучше boost::hash заюзать?


Название: Re: QHash ключ без учета регистра
Отправлено: Igors от Август 08, 2011, 21:34
ну потом прицепом еще некоторые контейнеры пришлось переопределить
Та отож, потом все время придется "переливать", накручивать операторы и.т.п.

Может, лучше boost::hash заюзать?
Так это ж
Код:
Не имеет к Qt никакого отношения
:)
Может bug report/feature request сбацаем? (English я возьму на себя)


Название: Re: QHash ключ без учета регистра
Отправлено: twp от Август 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()); }
};


Название: Re: QHash ключ без учета регистра
Отправлено: Пантер от Август 08, 2011, 21:41
Вот мне не нравится, что в Qt ушли от передачи своей функции сравнения, хеширования при создании контейнера. :(