具有关键和分类标准的容器

时间:2018-11-29 03:14:20

标签: c++ stl containers

我想要一个可以基于键(无符号值)进行搜索的项目集合,但是我希望根据不同的标准(即上次访问时间)对元素进行排序(这是值的一部分)

如何用C ++实现呢?我可以根据需要分别对它们进行排序,但是我可以自己创建容器以使排序自动进行吗?

是否有现成的容器(增强型)可以内置类似的功能?

1 个答案:

答案 0 :(得分:1)

您可能可以使用指向彼此的std::liststd::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进行迭代,并使用键为您的选择。