无法使用end()获取映射的第二个字段

Unable to get second field of map using end()

本文关键字:映射 获取 第二个 字段 end      更新时间:2023-10-16

我正在创建一个映射,只是为了学习的目的来存储一些键值对。如果我使用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() .