c++中有范围映射吗



在c++中,unordered_mapmap是从映射中搜索关键字的好工具。

我可以构建一个映射,其中键是date,值是double(或者我自己定义的结构(。

但我想要一个范围图,这意味着关键是一个范围,例如:

#inlcude <map>
m[20190101] =3;
m[20201201] = 4.
cout << m[20200101]; // i want this can return me 3. because 20200101 is
// lower-close to 20190101 

我该如何实现?

std::map将数据存储在二叉树中,因此您可以使用upper_boundlower_bound方法轻松找到大于/大于或等于某个值的最近密钥

  • m.lower_bound(k):返回一个迭代器,该迭代器指向键不小于k的第一个元素,如果找不到这样的元素,则返回m.end((
  • m.upper_bound(k):返回一个迭代器,该迭代器指向键大于k的第一个元素,如果找不到该元素,则返回m.end((

然后可以递减迭代器(如果它不等于begin()(以找到下一个较小的元素。

举个例子:

auto it = m.upper_bound(20200101);
if (it != m.begin())
std::cout << *--it;
else
std::cout << "no key <= 20200101";

早在2013/2014年,我就创建了一个基于C++标准库的容器类模板的range_map容器类模板。range_map的每个项都存储在一个名为range_map_item的类模板中,该模板有3个字段:左界、右界和存储项。(仅供参考,所有内容都在beneficii命名空间中。(它在很大程度上与std::map类似,但并不环绕它。我创建了自己的rb树来管理它的内容。

范围的工作方式如下。每个键都覆盖一个范围,如下所示:

[左向,右向(

意思是,左边界是范围的一部分,但右边界不是。

范围不能完全重叠,也就是说,你不能有2个范围,这是真的:

left1<left2<right1<右侧2

如果两个范围重叠,其中一个必须完全是另一个的子范围。

迭代器通过的是范围边界,而不是范围本身。它可以告诉你它当前指向的是左边界还是右边界。

我已经用它做了相当多的测试。我已经能够创建BMP文件,该文件是通过迭代一个包含随机范围的range_map来创建的,并显示结果。它似乎基本上有效,但我不能保证它会100%,而且我已经5年多没有碰过它了。

它没有文档,但与它交互所需的功能与C++标准库容器的对应功能类似。我最常使用emplace()。您只需将左边界、右边界和项传递给它即可。(仅供参考,"encaps"参数用于确定是否要封装预先存在的项,如果这些项恰好是您要输入/创建的项的子范围。(您也可以在emplace()上使用分段构造。(感谢我在网上找到的一个博客,它教会了我如何设置。(

这是图书馆的链接。你应该把它放在";benefitii";子文件夹,只需将该子文件夹放在include目录或项目目录中即可。编译器可以搜索包含文件的任何位置。该库仅为标头,因此不存在链接问题。

以下是下载链接:

https://drive.google.com/file/d/1SlBvIqnXwfJfsWv6yJsTm9SfutVok21U/view?usp=sharing

最新更新