c+中是否有范围图+;? 在C++中,代码> unordeDMAP 和 map 是从地图中搜索KEY的好工具。

c+中是否有范围图+;? 在C++中,代码> unordeDMAP 和 map 是从地图中搜索KEY的好工具。,c++,stl,unordered-map,C++,Stl,Unordered Map,我可以构建一个映射,它的键是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 auto it = m.upper_bo

我可以构建一个映射,它的键是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 
auto it = m.upper_bound(20200101);
if (it != m.begin())
    std::cout << *--it;
else
    std::cout << "no key <= 20200101";
#包括
m[20190101]=3;
m[20201201]=4。

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

  • m.lower_bound(k)
    :返回一个迭代器,该迭代器指向键不小于k的第一个元素,如果找不到该元素,则返回m.end()
  • m.upper_bound(k)
    :返回一个迭代器,该迭代器指向键大于k的第一个元素,如果找不到这样的元素,则返回m.end()
然后可以减小迭代器(如果它不等于
begin()
),以查找下一个较小的元素

以你为例:

#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 
auto it = m.upper_bound(20200101);
if (it != m.begin())
    std::cout << *--it;
else
    std::cout << "no key <= 20200101";
autoit=m.上限(20200101);
如果(it!=m.begin())

STD::CUT

2013/2014,我创建了一个在C++标准库的容器类模板上建模的<代码> RangeIMAP> <代码>容器类模板。

range\u map
的每个项都存储在名为
range\u map\u item
的类模板中,该类模板有3个字段:左边界、右边界和存储项。(仅供参考,所有内容都在
bengiii
名称空间中。)它在很大程度上类似于
std::map
,但并不环绕它。我创建了自己的rb树来管理它的内容

这些范围的工作方式如下。每个关键点涵盖的范围如下:

[左边界,右边界)

也就是说,左边界是范围的一部分,而右边界不是范围的一部分

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

left1 若两个范围确实重叠,则其中一个必须完全是另一个的子范围

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

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

没有文档,但是与它交互所需的函数与C++标准库容器的对应函数类似。我将经常使用<代码> Enthultand()/>代码。参数用于如果先前存在的项恰好是要输入/创建的项的子范围,则是否要封装这些项。)您还可以在

emplace()
上使用分段构造。(多亏了我在网上找到的一个博客,它教会了我如何设置。)

这是指向库的链接。您应该将其保存在“benginii”子文件夹中,然后将该子文件夹放在包含目录或项目目录或其他任何位置。编译器可以在任何位置搜索包含文件。库仅为标题,因此不存在链接问题

以下是下载的链接:


似乎是一厢情愿的想法。地图的键应该只识别一个元素,这是一个问题。但是如果你对地图中的范围不重叠感到满意,那么定制比较器应该可以做到这一点,尽管它可能很难实现。而不是在标准库中。你必须自己编写代码。但是你如何使用这样一张地图?你能提供你希望用来设置值并在以后检索它们的代码吗?@Galik请查看更新,我正在设计一个股票交易系统,我需要一个微型数据库来保存每只股票的交易费用,费用很少变化(在10年内,变化不到10次),这意味着建立一个[日期,价值]这是非常浪费的,我需要这么快,因为我需要搜索它很多。使用映射来进行搜索是毫无意义的。存储一个排序的日期数组并与值配对,然后使用二进制搜索来查找带有
std::lower_bound
或类似值的日期。太好了,谢谢Chris。所以我认为这比:将所有日期值逐个存储到映射中要慢ne.存储所有浪费的空间,但搜索将是O(1),此方法节省了空间,但lower_boud是一个O(log(n))操作,速度有点慢。这取决于数据,但由于缓存效果,浪费大量空间可能会以较慢的速度结束。最好的办法是分析不同的方法,以确定哪种方法最快(如果速度差很重要,或者由其他因素控制,例如I/O)