C ++地图集混合

时间:2019-06-18 12:36:45

标签: c++ algorithm dictionary set

我有文件夹信息

struct folder
{
    int id;
    int folder_count;
    long long size;
};

我需要使文件夹(可以是1000个或更多)分别按照它们的folder_count和大小排序(具有最多folder_count的文件夹必须排在首位,如果有相同的folder_count,则必须是按大小排序)。

我已经通过自定义比较器实现了

struct folder_comparator
{
    bool operator() (const folder& a, const folder& b) const 
    {
        return a.folder_count>b.folder_count || (a.folder_count==b.folder_count && a.size>=b.size);
    }  
};

并将文件夹放进去

set <folder, folder_comparator> folders;

但是与此同时,文件夹中有许多更新。我可以通过map来实现此目的,密钥是文件夹的id

map<int, folder> folders;

但是在这种情况下,我无法保持自定义顺序(如上所述)。

我都需要。 (保持自定义顺序和O(1)或至少O(log(N))复杂性搜索)

在这种情况下,什么数据结构或集合和映射的混合可以帮助我?

1 个答案:

答案 0 :(得分:2)

  

我都需要。 (保留自定义顺序和O(1)或至少O(log(N))复杂度搜索)

这意味着Boost Multi-Index最有可能完全适合您的需要,因为ID上的哈希索引和使用(固定)比较器的非唯一排序索引都可以。虽然它具有学习曲线,但似乎会增加您的工作量(而不是维护2个独立的容器)

您当前的比较器的PS不满足严格弱订购的要求,这是所有已排序标准容器和增强容器的一部分。无论哪种情况,都需要修复。提供适当比较器的最简单方法是使用std::tie

bool operator() (const folder& a, const folder& b) const 
{
    return std::tie( a.folder_count, a.size ) > std::tie( b.folder_count, b.size );
}