在c ++中访问地图的相邻元素

时间:2014-07-12 15:24:27

标签: c++ map stl

假设我有一个浮点整数映射 m

m[1.23] = 3
m[1.25] = 34
m[2.65] = 54
m[3.12] = 51

想象一下,我知道2.6554之间存在映射,但我不知道其他任何映射。

有没有办法访问相邻的映射而不从头开始迭代或使用find函数进行搜索?

换句话说:我是否可以通过了解单个映射来直接访问相邻的值...例如m[2.65]=54

1 个答案:

答案 0 :(得分:3)

更新或许比@MattMcNabb提出的更重要的“观点”:

Floating point keys in std:map


  

我是否可以通过了解单个映射(m [2.65] = 54)来直接访问相邻值

是。 std::map是有序集合;也就是说,如果operator<存在(更一般地说,std::less,对于密钥类型,您可以预期它具有已排序的访问权限。实际上 - 如果没有可用的比较运算符,您将无法为键类型创建映射(除非您传入谓词函数以在模板调用中执行此比较)

请注意,还有一个std::unordered_map,对于您不需要能够在“相邻”地图条目之间快速导航的属性,这通常更为可取。但是,在这种情况下,您需要定义std::hash。您仍然可以迭代它,但迭代中项目的相邻性与键的排序顺序无关。

更新也是由于@MattMcNabb

  

有没有办法访问相邻的映射而不从头开始迭代或使用find函数进行搜索?

你提到了数组符号,这里的一般答案是“不是真的”。也就是说没有办法说:

if (not m[2.65][-2]) {
   std::cout << "no element 2 steps prior to m[2.65]";
} else {
   std::cout << "the element 2 before m[2.65] is " << *m[2.65][-2];
}

虽然不存在这样的符号手段,但C ++的美感(也许是the horror)是你可以编写一个增强的地图来做到这一点。虽然人们会用火炬和干草叉来追你。或者也许他们会给你崇拜的地位,并把你的书放在最畅销的名单上。这是一个很好的路线 - 但在你尝试之前,用你的姓氏计算字母和顺序辅音,并确保它是一个很大的数字。

您需要访问订购的是iteratorfind会让你一个人;以及它提供的所有灵活性。

如果你只使用数组符号从std::map读取或写入,它本质上是一个在迭代器上构建的功能较少的便利层。因此,除非您构建自己的派生类,否则您将无法使用该层的限制。该表示法无法获取有关相邻值的信息...也不能让您测试某个键是否在地图中。 (如果m是您的地图,通过将查找结果与end(m)进行比较,您可以执行此操作。)

从技术上讲,find给你的效果与你从前到后或从后到前遍历迭代器并进行比较时得到的效果相同。但如果你正在寻找任意元素,这将会更慢。所有容器都有一种算法复杂性保证,您可以阅读。

取消引用迭代器时,您将收到一对,其第一个元素是键,第二个元素是值。该值将是可变的,但关键是不变的。所以你找不到一个元素,然后导航到一个相邻的元素,并直接改变它的键......只是它的值。

相关问题