当前位置: 首页 > news >正文

C++中vector的iterator迭代器的理解

在C++中,std::vector的迭代器(iterator)是一种用于遍历和访问容器元素的工具,其行为类似于指针。理解迭代器的位置需要从以下几个方面入手:


1. 迭代器的本质

  • 迭代器是指向vector中某个元素的抽象指针。
  • 它支持类似指针的操作,如解引用(*it)、自增(++it)等。
  • 迭代器的类型通常是std::vector<T>::iterator(或const_iterator)。

2. 迭代器的位置范围

  • 有效位置
    • 首元素vec.begin() 指向第一个元素。
    • 尾后位置vec.end() 指向最后一个元素的下一个位置(不是最后一个元素!)。
    • 中间位置:通过算术运算(如begin() + i)获得。
  • 无效位置
    • 解引用vec.end()是未定义行为(UB)。
    • 迭代器失效后(如vector扩容),再使用它是危险的。

3. 迭代器位置的操作

  • 访问元素
    std::vector<int> vec = {10, 20, 30};
    auto it = vec.begin(); // 指向10
    std::cout << *it;      // 输出10
    ++it;                  // 指向20
    
  • 算术运算
    auto it = vec.begin() + 1; // 指向20
    std::cout << *(it - 1);    // 输出10(向前移动)
    
  • 比较位置
    if (it == vec.end()) { /* 是否到达末尾 */ }
    

4. 迭代器失效问题

  • 导致失效的操作
    • push_backinsertresize等可能引发vector扩容的操作。
    • erase会使被删除元素及其后的迭代器失效。
  • 安全实践
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin();
    vec.push_back(4); // 可能导致it失效(若扩容)
    // 此时应重新获取迭代器:it = vec.begin();
    

5. 特殊迭代器位置

  • 反向迭代器
    auto rit = vec.rbegin(); // 指向最后一个元素(30)
    ++rit;                   // 指向倒数第二个元素(20)
    
  • 常量迭代器
    auto cit = vec.cbegin(); // 不可修改指向的值
    

6. 代码示例

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {10, 20, 30, 40};// 遍历元素for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " "; // 输出:10 20 30 40}// 插入元素(可能导致迭代器失效)auto it = vec.begin() + 2;vec.insert(it, 25); // 在30前插入25// vec = {10, 20, 25, 30, 40}// 删除元素it = vec.begin() + 1;vec.erase(it);      // 删除20// vec = {10, 25, 30, 40}
}

关键总结

  • begin()指向首元素,end()指向尾后位置
  • 迭代器类似指针,但需注意失效问题。
  • 通过算术运算调整位置(如it + n),但需确保不越界。
  • 反向迭代器(rbegin()/rend())提供逆向遍历。

理解迭代器位置是高效使用std::vector的基础,尤其在涉及动态修改容器时需格外谨慎!

http://www.dtcms.com/a/288707.html

相关文章:

  • C++ 编译链接机制的演化路径
  • 牛客NC14893 栈和排序(贪心 + 栈 + 后缀最大值维护)
  • 【机器学习|学习笔记】详解支持向量机(Support Vector Machine,SVM)为何要引入核函数?为何对缺失数据敏感?
  • 深入解析Hadoop中的EditLog与FsImage持久化设计及Checkpoint机制
  • Hadoop小文件合并技术深度解析:HAR文件归档、存储代价与索引结构
  • LeetCode|Day20|9. 回文数|Python刷题笔记
  • IP协议介绍
  • Linux: rsync+inotify实时同步及rsync+sersync实时同步
  • Leetcode 710. 黑名单中的随机数
  • 使用 Pyecharts 绘制精美饼状图:从基础到高级技巧
  • PDF 编辑器:多文件合并 拆分 旋转 顺序随便调 加水印 密码锁 页码背景
  • 微服务雪崩防护最佳实践之sentinel
  • Java 大视界 -- Java 大数据在智能安防门禁系统中的权限动态管理与安全审计(353)
  • 嵌入式硬件篇---舵机(示波器)
  • 测试学习之——Pytest Day4
  • python中读取 Excel 表格数据
  • 将EXCEL或者CSV转换为键值对形式的Markdown文件
  • 推荐一款基于.NET的进程间通信框架
  • 【橘子分布式】gRPC(编程篇-下)
  • 基于SHAP的特征重要性排序与分布式影响力可视化分析
  • ZooKeeper学习专栏(一):分布式协调的核心基石
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • 智能驾驶整体技术架构详解
  • OPC UA, CAN, PROFINET, SOCKET, MODBUS, HTTP, S7七种物联网常用协议解释
  • Shell脚本-tee工具
  • 《计算机网络》实验报告三 UDP协议分析
  • DAY 20 奇异值分解(SVD)
  • 【Elasticsearch】冷热集群架构
  • 【数据结构】二维差分数组
  • 【milvus检索】milvus检索召回率