[英]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.65
和54
之间存在映射,但我不知道任何其他映射。
有没有办法访问相邻的映射而不从头开始迭代或使用find
函数进行搜索?
换句话说:我可以通过了解单个映射来直接访问相邻的值...例如m[2.65]=54
?
更新 @MattMcNabb提出的可能比我的答案更重要的“重点”:
我可以通过了解单个映射来直接访问相邻的值(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.