无法使用end()获取映射的第二个字段
Unable to get second field of map using end()
我正在创建一个映射,只是为了学习的目的来存储一些键值对。如果我使用begin()
函数打印地图的第二个字段,我能够打印地图的第二个字段,但是当我尝试使用end()
对地图的最后一个元素做同样的事情时,它无法打印第二个字段。下面是我的代码:
#include <iostream>
#include <cstdlib>
#include <map>
#include <string>
#include <stdio.h>
using namespace std;
map<int,std::string> arr;
map<int,std::string>::iterator p;
int main(int argc, char** argv) {
arr[1] = "Hello";
arr[2] = "Hi";
arr[3] = "how";
arr[4] = "are";
arr[5] = "you";
p = arr.begin();
printf("%sn",p->second.c_str());
p = arr.end();
printf("%sn",p->second.c_str());
return 0;
}
解引用end()
是未定义的行为,因为end()
在映射结束后返回一个指向1的迭代器。如果你想要最后一个元素,那么你可以使用
p = --arr.end();
不能使用
p = arr.rbegin()
因为你不能将反向迭代器赋值给正向迭代器(实例)。如果你想使用rbegin()
,那么你必须创建一个反向迭代器。
map<int,std::string>::reverse_iterator rit;
rit = arr.rbegin();
// or
auto rit = arr.rebegin(); //C++11 or higher required for this
或者您可以使用下面的answer by visitor
将其转换为前向迭代器与往常一样,您应该检查以确保您有一个有效的迭代器。如果容器为空,begin() == end()
和解引用都是未定义的行为。
来源:http://en.cppreference.com/w/cpp/container/map/end
打印最后一个元素,使用反向迭代器:
map< int,std::string>::reverse_iterator p;
p = arr.rbegin();
if( p != arr.rend() ) {
// Do whatever with, it points to the last element
} else {
// map is empty
}
std::map::end
将返回迭代器到过去的最后一个元素,解引用是未定义的行为。
From std::map::end
at en.cppreference
返回对象的最后一个元素后面的元素的迭代器容器。此元素充当占位符;试图访问它导致未定义的行为。
您可以使用--arr.end()
或arr.rbegin()
。
arr.end()
返回最后一个元素后面的元素的迭代器。这允许更容易的编写循环。这个元素只用于比较。不允许对其解引用。
std::SOMETHING.end()不返回最后一个元素,它返回经过结束的元素。查看c++文档。从本质上讲,你所做的是试图遵从未定义的内存位置。
在其他文章中已经指出,end()
是一个迭代器,位于地图中最后一个元素的后面一个位置。因此,您不应该试图获取它的字段。要获取最后一个元素,您可以使用rbegin()
.
- 我如何获取从 C++ 到 C 的映射<字符串、int>#
- C++映射有2个键,这样任何1个键都可以用来获取值
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- C++ 在集合和映射容器中获取唯一值
- 通过从矢量中获取键和与映射中的键对应的值来创建映射
- 虚幻引擎 - 如何通过C++代码获取轴映射
- 为C++中的无序映射获取给定输入键的错误值
- 我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么
- 在boost::hana中给定一个键元组,如何从映射中获取值元组
- 如何获取二叉树(集合或映射)的根
- 将从std::映射中获取的std::pair引用传递给接受std::对引用的函数
- 获取指向映射内结构的指针
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 如何从映射中获取值并在 C++ 的 switch 语句中使用它
- 编译按映射类型获取元素的映射错误元组
- C++ 当第二个元素为 X 时,映射获取第一个元素
- C++11:std::unordered_map<int,std::stack<int>> 从映射获取值而无需多次复制
- 在 STL 中使用映射获取编译错误C++
- 无法从指向多态类的指针映射获取有效的指针