C++迭代器与map的.end()方法工作机制及示例代码解析
C++ map迭代器相关代码逐行解释
先理清三个核心概念,方便理解后续逻辑:
- 迭代器:可以理解为指向容器内部元素的类指针对象,支持通过
++/--在容器的元素之间移动,通过->或者*访问指向的元素内容,是STL容器通用的元素访问工具。 .end():所有STL容器都提供的方法,返回值是一个迭代器,它不指向容器内的任何有效元素,仅作为“容器已经遍历到末尾”的边界标记,位置在容器最后一个有效元素的后面,直接对这个迭代器解引用访问内容是未定义行为。first成员:std::map存储的每个元素都是std::pair<const 键类型, 值类型>结构的键值对,first就是键值对里的键,对应的second是键绑定的值。
逐行代码执行流程
先贴完整可编译的规范代码(修正了原代码漏写std::命名空间的问题):
std::map<int, double> e; e[1] = 10.0; e[2] = 20.0; e[3] = 30.0; e[4] = 40.0; std::map<int, double>::iterator it; it = e.end(); it--; int d = 1.0*it->first / 50000;
逐行执行逻辑:
std::map<int, double> e;
声明一个空的std::map容器,命名为e,容器规则为:键类型是int,键绑定的值类型是double,内部元素会自动按照键的升序排列存储。e[1] = 10.0;
调用map的[]运算符,因为当前容器里不存在键为1的元素,所以插入一个新键值对:键为1,对应值为10.0。e[2] = 20.0;
插入键为2的新键值对,值设为20.0。e[3] = 30.0;
插入键为3的新键值对,值设为30.0。e[4] = 40.0;
插入键为4的新键值对,值设为40.0。
执行完这4行插入操作后,map内部按排序后的顺序存储的元素依次为:(1,10.0) → (2,20.0) → (3,30.0) → (4,40.0)。std::map<int, double>::iterator it;
声明一个适配当前int-double类型map的迭代器,命名为it,此时迭代器还未指向任何有效位置,属于未初始化状态。it = e.end();
给迭代器it赋值,让它指向mape的尾后边界位置,也就是最后一个有效元素(4,40.0)的后一位,这个位置仅做标记用,不能直接访问内容。it--;
map的迭代器是双向迭代器,支持向前、向后移动位置,这里将迭代器向前移动1位,就从尾后边界指向了容器内最后一个有效元素:键为4、值为40.0的键值对。int d = 1.0*it->first / 50000;
这行的计算分三步:- 首先通过
it->first取出当前迭代器指向元素的键,也就是整数4 - 乘以
1.0是为了把整数4隐式转换为double类型的4.0,避免后续做整数除法丢失精度 - 计算
4.0 / 50000得到结果0.00008,最后将这个浮点数转换为int类型赋值给变量d,转换时小数部分会被直接截断,所以最终d的值为0。
- 首先通过
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

