[C++面试] 迭代器与指针有什么区别?

面试考察建议

  • 入门问题:验证基础语法和概念理解。
  • 进阶问题:考察类型系统、内存安全等核心知识。
  • 高阶问题:测试对底层实现和泛型编程的理解。

一、入门

1、本质

指针:一种内置的数据类型,直接指向内存地址;指针主要用于操作数组或动态分配的内存块;

迭代器:一种抽象概念,是为了统一对不同容器的访问方式而设计的,它是容器提供的一种接口。迭代器适用于所有标准库容器,如 std::vectorstd::list 等。

2、迭代器和指针的共同点是什么?

解引用操作:均可通过*访问指向的数据。

成员访问:都可以使用 -> 操作符来访问对象的成员

算术运算:支持自增(++)、自减(--)操作

    // 指针遍历数组
    for (int *p = arr; p != arr + 3; ++p) {
        std::cout << *p;
    }
    
    // 迭代器遍历vector
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it;
    }

3、用迭代器实现指针的随机访问?

std::vector<int> vec = {1,2,3,4,5};
auto it = vec.begin() + 2;  // 直接跳转到索引2(值为3)

二、进阶

1、从类型系统、安全性、失效场景三方面对

  • 类型系统

    • 指针:类型严格匹配(如int*float*不可互赋)
    • 迭代器:通过模板实现泛型,适用于所有容器(如template<typename Iter>
  • 安全性

    • 指针:易出现野指针、内存泄漏、越界访问(如int* p = nullptr; *p = 1;
    • 迭代器:提供边界检查(如it != end()),但容器结构变化可能导致失效(如vector扩容)
  • 失效场景

    • 指针:对象销毁后自动失效(如delete ptr;后继续使用)
    • 迭代器:容器结构变化时失效(如vec.insert(it, 10);it失效)

三、高阶

1、为什么vector<bool>的迭代器行为特殊?

std::vector<bool> 为了节省内存,不会像普通的 std::vector 那样为每个 bool 元素分配一个字节(8 位)的内存空间,而是采用位压缩的方式。由于 bool 元素是以位的形式存储的,不能直接对单个位进行常规的指针操作,因此普通的指针无法直接作为 std::vector<bool> 的迭代器。

int main() {
    std::vector<bool> vec = {true, false, true};
    // bool* p = &vec[0];  // 编译错误或返回无效地址。返回的是代理对象的临时地址,而非实际存储位的内存地址

    auto it = vec.begin();
    // 这里 *it 返回的是 std::vector<bool>::reference 类型的代理对象
    std::cout << std::boolalpha << *it << std::endl;
    return 0;
}

2、必须用指针/迭代器的场景?

  • 必须用指针的场景

    • 与C库交互(如qsort
    • 多态对象动态绑定(如Base* ptr = new Derived()
  • 必须用迭代器的场景

    • STL算法操作(如std::sort
    • 复杂容器遍历(如std::map的键值对访问)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值