允许在查找时忽略子索引的复合索引的 C++ 容器

Posted

技术标签:

【中文标题】允许在查找时忽略子索引的复合索引的 C++ 容器【英文标题】:C++ container for compound index that allows ignoring sub-index at look-up 【发布时间】:2012-02-22 12:52:05 【问题描述】:

什么是允许在查找时忽略子索引的复合索引的合适容器?它不应该比没有此功能的容器使用更多的资源。

F.e.给定索引

struct index_t

    index_t(unsigned key_, unsigned subkey_)
        :   key(key_)
        ,   subkey(subkey_)
    
    unsigned key;
    unsigned subkey;
;

插入

index_t(1,11)
index_t(2,21)
index_t(2,22)
index_t(2,23)
index_t(3,31)

所有带有 f.e. 的元素key == 2 并忽略 subkey 必须查找。

还必须可以使用给定的key subkey 进行查找。因此,使用带有key 的多重集/映射作为唯一容器的键不是解决方案。

【问题讨论】:

我找到了解决方案,将在 8 小时超时后发布。 multimap<key_t, multimap<subkey_t, data_t> > 将是一个解决方案,但会在存储和编程方面引入一些开销。 @hpc:感谢您正确地进行 Stack Overflow。在 1rep 用户中非常罕见。 不会发布我的解决方案,因为@StilesCrisis 解决方案非常完美。 【参考方案1】:

你可以这样做

std::set<index_t>  mySet;

要搜索具有给定键和任何子键的所有项目,请执行

std::pair<std::set<index_t>::iterator, std::set<index_t>::iterator> range;
range.first = mySet.lower_bound(index_t(key, 0));
range.second = mySet.upper_bound(index_t(key, UINT_MAX));

这将保持 2*log n 的性能。

【讨论】:

当然,谢谢!如果从 lower_bound 迭代,则不需要调用 upper_bound() 啊,它应该是range.second = mySet.upper_bound(index_t(key+1, 0));,因为upper_bound()(不像lower_bound())返回一个迭代器,指向一个严格来说更大的元素。 很高兴为您提供帮助!不过,不太清楚upper_bound 不起作用是什么意思。 我不是说upper_bound() 不工作。在第一条评论中,我的意思是如果迭代从下限开始直到key 发生变化,则不需要upper_bound()。在第二条评论中,我注意到上限 index_t 必须设置为下一个更大的索引,因为迭代通常会在 it == range.second 处中断。 我认为lower_bound(index_t(key+1, 0))upper_bound(index_t(key, UINT_MAX)) 都会做正确的事情。但我认为upper_bound(index_t(key+1, 0)) 将包含值为key+1, 0 的条目。试试看你是否不同意。另外,您还打算发布您的解决方案吗?还是比这更复杂?

以上是关于允许在查找时忽略子索引的复合索引的 C++ 容器的主要内容,如果未能解决你的问题,请参考以下文章

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用iloc基于行索引位置列表筛选dataframe数据中指定位置的多个数据行

pandas使用read_csv函数读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用方括号[]基于最外层列索引名称索引列数据

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用xs函数获取行切面数据(level参数指定行层索引列表key参数指定索引值列表)

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的层列索引)

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的层列索引)

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)