Нужно хранить в map только N отсортированных значений.
map.size() < N, тогда добавляем элементы.map.size() > N, тогда добавляем новые элементы, удаляя лишние.Вариант не добавлять новые элементы в map, если достигнут лимит N, не подходит. Идея заключается в том, чтобы всегда хранить актуальные данные, которые обновляются.
Может при каждой операции добавления пробегать итератором и удалять лишние элементы? Как-то так:
map // список с 3 элементами
map.insert(); // 4 элемента
// удаляем все элементы, кроме первых 3х
Но мне такая реализация кажется будет медленной.
Может у кого-то есть другое, более элегантное решение?
Если я правильно понел, вы хотите оставлять первые 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;
}
Мне кажется вам подойдет QCache, которому можно установить максимальное число элементов, превышая которое ранние элементы перетираются.
Продвижение своими сайтами как стратегия роста и независимости