在c++中访问映射的相邻元素

Accessing adjacent elements of a map in c++

本文关键字:元素 映射 c++ 访问      更新时间:2023-10-16

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

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

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

是否有任何方法可以访问相邻的映射,而无需从头开始迭代或使用find函数进行搜索?

换句话说:我只知道一个映射就可以直接访问相邻的值吗。。。如CCD_ 4?

更新也许有一个比我的答案更重要的"点",由@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++的美妙之处(也许还有恐怖之处(在于,你可以编写一个增强的map来实现这一点。尽管人们会拿着火把和干草叉来追你。或者他们会给你狂热的地位,把你的书列入畅销书名单。这是一条很细的线,但在你尝试之前,先数一下你姓氏中的字母和顺序辅音,并确保这是一个很大的数字。

访问排序所需的是迭代器。find会给你一个;以及它所提供的所有灵活性。

如果您只使用数组表示法从std::map读取或写入,那么它本质上是一个在迭代器之上构建的功能较弱的便利层。所以,除非您从map中构建自己的类,否则您将被该层的限制所束缚。该符号无法获得有关相邻值的信息。。。它也不允许您测试键是否在映射中(使用find,如果m是您的地图,您可以将查找结果与end(m)进行比较。(

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

当取消引用迭代器时,您将收到一对,其第一个元素是键,第二个元素是值。该值是可变的,但键是常量。因此,您无法找到一个元素,然后导航到相邻的元素,并直接更改其键。。。只是它的价值。