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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (Q)Map последних значений  (Прочитано 5704 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 01, 2015, 13:59 »

Добрый день

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

Спасибо
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Июнь 01, 2015, 14:02 »

А чем QCache не угодил?
Записан
Bepec
Гость
« Ответ #2 : Июнь 01, 2015, 14:34 »

int QMap::count () const
или
int QMap::size () const
Плюс ваш велосипед в виде условий удаления.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 02, 2015, 08:35 »

А чем QCache не угодил?
Очень даже угодил - просто забыл о нем Улыбающийся Спасибо

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Июнь 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());
    }
}


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

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 12, 2015, 11:50 »

Ну, наверное, надо будет еще на возможные повторы проверять, но эт смотря что надо по логике.
А что "не проверять" имеет какой-то смысл?  Улыбающийся Тогда приведите пример когда usable и без проверки - я такого не вижу 
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Июнь 12, 2015, 13:22 »

Если usable и без проверки - то допустим, когда точно известно, что все ключи уникальные (например, Timestamps).

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 12, 2015, 13:46 »

Если usable и без проверки - то допустим, когда точно известно, что все ключи уникальные (например, Timestamps).
Тогда и мапы никакие не нужны, контейнер и push_back/pop_front

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Июнь 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 осталось, во втором - вылетело.

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июнь 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] ?
В мапе Вы не можете управлять порядком (на то она и мапа). Если Вы имели ввиду список, то первый вариант
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Июнь 15, 2015, 17:29 »

Ну, я имел в виду порядок в "хистори". Но не суть Улыбающийся Если с QCache все работает, то хорошо
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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