C++ 密钥和排序条件分开的容器

C++ 密钥和排序条件分开的容器,c++,stl,containers,C++,Stl,Containers,我希望有一个基于键(无符号值)可搜索的项目集合,但我希望元素根据不同的标准进行排序,即上次访问时间(值的一部分) 如何在C++中实现这一点?我可以根据需要对它们进行单独排序,但是我可以创建容器本身,以便自动进行排序吗 是否有现成的容器(在boost中)可以内置类似的功能?您可能可以使用彼此指向的std::list和std::unordered_map实现这类功能 #include <list> #include <unordered_map> template <

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

如何在C++中实现这一点?我可以根据需要对它们进行单独排序,但是我可以创建容器本身,以便自动进行排序吗


是否有现成的容器(在boost中)可以内置类似的功能?

您可能可以使用彼此指向的
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;
    }
};
#包括
#包括
模板
结构缓存{
使用key=unsigned;
结构复合材料{
复合(A&_A,std::list::iterator _it):A(_A),it(_it){
A&A;
std::list::迭代器;
};
std::无序地图;
std::列表;
无效插入(键k、A和A){//假设插入包含访问
列表:前方阵地(k);
map[k]=Composite(a,list.front());
}
A和操作员[](k键){
list.erase(映射[k].it);
列表:前方阵地(k);
返回映射[k].a;
}
A&last_accessed(){//或任何您希望实现的其他内容
断言(!list.empty());
返回映射[list.front()]a;
}
};

此解决方案经过优化,可跟踪最后访问的元素。如果您想对给定的不同属性进行排序,可以遵循类似的过程,但使用
std::set
将值与比较函数一起存储,然后使用您选择的键从
std::unordered_map
散列迭代器到该值。

我从未尝试过,但是请相信,您可以实现一个比较函数,并将其与std::map一起使用。每个项目都可以保存上次访问它们的日期,您可以根据此值进行排序。一种简单的方法是使用
std::forward_list
存储
std::unordered_map
中元素的键,具体取决于最近访问它们的方式,并存储从
std::unordered_map
的值到列表元素的指针,以便可以在O(1)中更新访问时间。我将尝试拼凑一些代码并发布。@Brady:我想根据存储在容器值部分的时间进行订购。。。可能吗?我想我可以只基于key@ArunValakottial比较函数可以做任何它想做的事情。我正在试着做一个模型,我会把它作为一个答案贴出来。你使用无序地图有什么原因吗?我在想一些类似于std::map和std::list的东西。当一个项目被访问时,它被移动到列表的开头,它在映射中的迭代器被用来更新映射到该项目的迭代器。或者最好使用中间映射,这样实际对象就不会移动。@BradyDean我明白你的意思,但是
std::map
O(logn)
访问时间,而不是
O(1)