繁体   English   中英

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

[英]Accessing adjacent elements of a map in c++

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

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

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

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

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

更新 @MattMcNabb提出的可能比我的答案更重要的“重点”:

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 ++的美丽(也许是恐怖 )是你可以编写一个增强的地图来做到这一点。 虽然人们会用火炬和干草叉来追你。 或者也许他们会给你崇拜的地位,并把你的书放在最畅销的名单上。 这是一个很好的路线 - 但在你尝试之前,用你的姓氏计算字母和顺序辅音,并确保它是一个很大的数字。

您需要访问订购的是迭代器 find会得到你一个; 以及它提供的所有灵活性。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM