gpt4 book ai didi

c++ - 在 C++ 中访问 map 的相邻元素

转载 作者:行者123 更新时间:2023-11-30 02:45:11 24 4
gpt4 key购买 nike

假设我有一个浮点整数映射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 提出的可能是比我的回答更重要的“要点”:

Floating point keys in std:map


Can I directly access the adjacent values by just knowing about a single mapping (m[2.65]=54)

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

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

更新也是由于@MattMcNabb

Is there any way to visit the adjacent mappings without iterating from the beginning or searching using the find function?

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

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 )在于您可以编写一个 map 的扩充来做到这一点。尽管人们会拿着火把和干草叉来追你。或者,也许他们会给你崇拜的地位,把你的书放在畅销书排行榜上。这是一条很好的路线——但在你尝试之前,数一数你姓氏中的字母和连续辅音,并确保它是一个很大的数字。

访问订单所需的是 iterator .和 find 会给你一个;以及它提供的所有灵 active 。

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

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

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

关于c++ - 在 C++ 中访问 map 的相邻元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24714391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com