我想要一个可以基于键(无符号值)进行搜索的项目集合,但是我希望根据不同的标准(即上次访问时间)对元素进行排序(这是值的一部分)
如何用C ++实现呢?我可以根据需要分别对它们进行排序,但是我可以自己创建容器以使排序自动进行吗?
是否有现成的容器(增强型)可以内置类似的功能?
答案 0 :(得分:1)
您可能可以使用指向彼此的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
进行迭代,并使用键为您的选择。