Qt/C++. Фиксированный размер map

106
22 марта 2021, 19:00

Нужно хранить в map только N отсортированных значений.

  • map.size() < N, тогда добавляем элементы.
  • map.size() > N, тогда добавляем новые элементы, удаляя лишние.

Вариант не добавлять новые элементы в map, если достигнут лимит N, не подходит. Идея заключается в том, чтобы всегда хранить актуальные данные, которые обновляются.

Может при каждой операции добавления пробегать итератором и удалять лишние элементы? Как-то так:

map // список с 3 элементами
map.insert(); // 4 элемента
// удаляем все элементы, кроме первых 3х

Но мне такая реализация кажется будет медленной.

Может у кого-то есть другое, более элегантное решение?

Answer 1

Если я правильно понел, вы хотите оставлять первые size элементов. Тогда предложу вариант, например, такой:

template <size_t k, typename K, typename V,
     typename T = std::pair<K, V>>
std::map<K, V>&
inserter(std::map<K, V>& m, const T& p)
{
    m.insert(p);
    if (m.size() > k)
        m.erase(std::next(m.begin(), k), m.end());  
    return  m;
}

и пример использования:

int main() {    
    std::map<std::string, int> map;
    constexpr size_t size = 7;
    int k = 10;
    std::string s("B");
    while (k++ < 20) {
        s += char('A' + rand()% k);
        inserter<size>(map, { s, k });
    }
    // использовать map(имеет не более чем 7 элементов
    return 0;
}
Answer 2

Мне кажется вам подойдет QCache, которому можно установить максимальное число элементов, превышая которое ранние элементы перетираются.

READ ALSO
Отправить данные на определенный сайт и обработать ответ. libcurl

Отправить данные на определенный сайт и обработать ответ. libcurl

Хотелось бы через libcurl отправлять свой Unicode текст и получать ответ на вот этом сайте https://wwwdcode

89
Многопоточность. Проблемы с пониманием mutex и lock_guard

Многопоточность. Проблемы с пониманием mutex и lock_guard

UPD: удалил вторую часть вопроса, оставил чисто мьютекс и лок-гард

105
Qt. Как сгенерировать HTML-файл с тегами?

Qt. Как сгенерировать HTML-файл с тегами?

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

78
оператор lock ()

оператор lock ()

Почему оператор lock () предназначен для приема только параметров ссылочного типа?

103