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的基础,尤其在涉及动态修改容器时需格外谨慎!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值