crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Есть ли в Qt видоизмененный QMap, тогда не надо будет изобретать велосипед
AD
  опции профиля:
сообщение 18.8.2008, 10:43
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В Qt есть класс-контейнер QMap<Key, Value>. А есть ли в Qt такой спец. QMap, который имеет не один, а два ключа: т.е. вначале ищет по одному ключу, если ничего не нашел, пытается поискать по второму ключу!

Для чего это нужно: чтобы при вот таком, предположим, QMap<QString, QString, double> и такой строке:
QString key = "1243";
double i = map[key];

Он пытался найти этот ключ в 1-ом ключе и во 2-ом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 18.8.2008, 13:14
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я бы два словаря использовал:
QMap<QString, QString> - m/s = м/с
QMap<QString, double> - m/s = 1
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.8.2008, 13:24
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 18.8.2008, 14:14) *
я бы два словаря использовал:
QMap<QString, QString> - m/s = м/с
QMap<QString, double> - m/s = 1

Красиво, я бы сказал, элегантное решение, но ресурсоемкое! Два мепа. Я подумаю, может быть, где-то твой вариант будет очень хорошо подходить! Еще раз огромное спасибо обоим! :) :) :) А в данном случае решение выглядит так. Вроде бы неплохо, тоже:

bool MetricReader::TRead()
{
    bool ret = false;
    if(!open()) return ret;

    QTextStream in(file);
    QString rc= "";
    while(!in.atEnd())
    {
        rc = in.readLine().simplified();
        if(rc.find("//") != -1 || rc.isEmpty()) continue;

        insertValue(rc);
    }

    ret = true;

    QFile* fl = new QFile("test.txt");
    fl -> open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
    QTextStream in1(fl);
    for(QMap<QString, double>::iterator iter=metric_map.begin(); iter!=metric_map.end(); ++iter)
        in1 << iter.key() << ":\t\t" << iter.value() << endl;
    fl -> close();

    return ret;
}

void MetricReader::insertValue(QString& rc)
{
    QString left = rc.simplified().section("=", 0, 0).simplified().trimmed();
    QString left_subleft = left.section("|", 0, 0).simplified().trimmed();
    QString right_subleft = left.section("|", 1, 1).simplified().trimmed();

    QString right = rc.simplified().section("=", 1, 1).simplified().trimmed();        bool ok;
    double value = right.toDouble(&ok);

    metric_map.insert(left_subleft, value);
    if(left_subleft != right_subleft)
        metric_map.insert(right_subleft, value);
}


В результате получилось такое:
1:        1
1/km:        0.001
1/км:        0.001
DDM:        11.429
_km:        1
_км:        1
h:        0.017
km:        1000
km/h:        3.6
m:        1
m/s:        1
minute:        1
s:        60
°:        1
РГМ:        11.429
км:        1000
км/ч:        3.6
м:        1
м/с:        1
минут:        1
с:        60
ч:        0.017


P.S. Про нормальную форму теперь понятно! :) Как видно из кода, это делается сразу!

Сообщение отредактировал AD - 18.8.2008, 13:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.1.2025, 21:09