Вероятно, вы могли бы реализовать что-то в этом роде, используя std::list
и std::unordered_map
, указывающие друг на друга.
#include <list>
#include <unordered_map>
template <typename A>
struct Cache {
using key = unsigned;
struct Composite {
Composite(A &_a, std::list<key>::iterator _it) : a(_a), it(_it) {}
A &a;
std::list<key>::iterator it;
};
std::unordered_map<key, Composite> map;
std::list <key> list;
void insert(key k, A &a) { // Assuming inserting contains accessing
list.emplace_front(k);
map[k] = Composite(a, list.front());
}
A &operator[](key k) {
list.erase(map[k].it);
list.emplace_front(k);
return map[k].a;
}
A &last_accessed() { // or whatever else you wish to implement
assert(!list.empty());
return map[list.front()].a;
}
};
Это решение оптимизировано для отслеживания того, к какому элементу обращались в последний раз.Если вы хотите отсортировать данные по другому атрибуту, вы можете выполнить аналогичный процесс, но использовать std::set
для хранения значений с помощью функции сравнения, а затем итераторы для этого из std::unordered_map
, хешированного с выбранным вами ключом.