在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.65
和54
之间有一个映射,但我不知道任何其他映射。
是否有任何方法可以访问相邻的映射,而无需从头开始迭代或使用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
为您提供了与您通过前后遍历迭代器并在排序时进行比较所获得的效果相同的效果。但如果你在寻找任意元素,速度会慢一些。所有的容器都有一种算法复杂性保证,你可以在上阅读
当取消引用迭代器时,您将收到一对,其第一个元素是键,第二个元素是值。该值是可变的,但键是常量。因此,您无法找到一个元素,然后导航到相邻的元素,并直接更改其键。。。只是它的价值。
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除映射和分割错误中的一个过去结束元素
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- C++映射不删除元素
- 打印无序映射的第二个元素,即集合
- 更改多重映射容器中所有元素的键值
- C++ 将元素分配给映射值时访问错误
- 类中的 C++ 全局映射,不要打印 map 元素
- 如何将元素插入和迭代到这种映射.C++
- 将数组的元素插入映射的时间复杂度是多少?
- 如何检查映射值中是否存在元素
- 常量映射和常量元素映射之间的区别
- 映射C++按值排序和插入元素
- 如何为映射和priority_queue编写比较器,其中元素是二维数组
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 无法将元素添加到 STL 映射
- 索引标准/提升::按结构元素映射