Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Июнь 01, 2015, 13:59



Название: (Q)Map последних значений
Отправлено: Igors от Июнь 01, 2015, 13:59
Добрый день

Есть мапа, напр QMap <int, int> которая хранит последние значения, типа "истории". Как удобнее (или проще всего) ограничить ее размер? Напр макс 100, если добавляется 101-й, то "самый старый" эл-т удалится.

Спасибо


Название: Re: (Q)Map последних значений
Отправлено: Hellraiser от Июнь 01, 2015, 14:02
А чем QCache не угодил?


Название: Re: (Q)Map последних значений
Отправлено: Bepec от Июнь 01, 2015, 14:34
int QMap::count () const
или
int QMap::size () const
Плюс ваш велосипед в виде условий удаления.


Название: Re: (Q)Map последних значений
Отправлено: Igors от Июнь 02, 2015, 08:35
А чем QCache не угодил?
Очень даже угодил - просто забыл о нем :) Спасибо

Все-таки интересно - а без готового класса как? Забыв о QCache я задействовал QMap и QLinkedList - получилось десятка 2 строк. С тем же успехом можно std::map + std::list - но нет ли чего-то получше?


Название: Re: (Q)Map последних значений
Отправлено: Racheengel от Июнь 12, 2015, 11:32
Создать лист и в него паковать ключи мапы при вставке нового элемента.
Как только переполнился - первый ключ нафиг. Типа:

Код:

QMap<X,Y> m_history;
QList<X> m_keys;

void InsertItem(X key, Y value)
{
    m_history[key] = value;
    m_keys.append(key);
    if (m_keys.size() > MAX_SIZE_ALLOWED)
    {
        m_history.remove(m_keys.takeFirst());
    }
}


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



Название: Re: (Q)Map последних значений
Отправлено: Igors от Июнь 12, 2015, 11:50
Ну, наверное, надо будет еще на возможные повторы проверять, но эт смотря что надо по логике.
А что "не проверять" имеет какой-то смысл?  :) Тогда приведите пример когда usable и без проверки - я такого не вижу 


Название: Re: (Q)Map последних значений
Отправлено: Racheengel от Июнь 12, 2015, 13:22
Если usable и без проверки - то допустим, когда точно известно, что все ключи уникальные (например, Timestamps).

А если они не уникальны - какая предполагается логика? Переписать существующее значение в мапе новым или же убить старое и добавить новое "в хвост"?


Название: Re: (Q)Map последних значений
Отправлено: Igors от Июнь 12, 2015, 13:46
Если usable и без проверки - то допустим, когда точно известно, что все ключи уникальные (например, Timestamps).
Тогда и мапы никакие не нужны, контейнер и push_back/pop_front

А если они не уникальны - какая предполагается логика? Переписать существующее значение в мапе новым или же убить старое и добавить новое "в хвост"?
Зачем задавать вопрос если ответ ясен хотя бы из названия темы (последних)? :) Новая пара ключ-значение сохраняется в мапе всегда, но для мапы есть предел роста, "самые старые" значения должны вытесняться.


Название: Re: (Q)Map последних значений
Отправлено: Racheengel от Июнь 12, 2015, 16:01
Цитировать
Новая пара ключ-значение сохраняется в мапе всегда, но для мапы есть предел роста, "самые старые" значения должны вытесняться.

Дык, я поэтому и спрашиваю - по какому принципу? Объясню, что имею в виду.
Допустим, есть мапа типа
[A,10][B,15][C,20]...[E,10][K,100500]

Теперь мы в нее запихиваем [A, 55].
В мапе уже есть значение [A,10]. Оно, естественно, перепишется на [A,55], но вопрос: должно ли "новое" значение A=55 пониматься как "последнее вставленное", либо оно просто становится на место старого ключа?
Т.е. так:
[B,15][C,20]...[E,10][K,100500][A,55] или так: [A,55][B,15][C,20]...[E,10][K,100500] ?

При добавлении следующего значения, например, [X,666], как должна выглядеть история?

[C,20]...[E,10][K,100500][A,55][X,666] или так: [B,15][C,20]...[E,10][K,100500][X,666] ?

Т.е. в первом случае A осталось, во втором - вылетело.



Название: Re: (Q)Map последних значений
Отправлено: Igors от Июнь 13, 2015, 06:03
В мапе уже есть значение [A,10]. Оно, естественно, перепишется на [A,55], но вопрос: должно ли "новое" значение A=55 пониматься как "последнее вставленное",
Конечно должно, ведь обращение по ключу A было последним

Т.е. так:
[B,15][C,20]...[E,10][K,100500][A,55] или так: [A,55][B,15][C,20]...[E,10][K,100500] ?
В мапе Вы не можете управлять порядком (на то она и мапа). Если Вы имели ввиду список, то первый вариант


Название: Re: (Q)Map последних значений
Отправлено: Racheengel от Июнь 15, 2015, 17:29
Ну, я имел в виду порядок в "хистори". Но не суть :) Если с QCache все работает, то хорошо