允许在查找时忽略子索引的复合索引的 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函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)