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

[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的键值对访问)

相关文章:

  • nacos下载及安装
  • Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能
  • 力扣热题 100:二叉树专题经典题解析(前8道)
  • 嵌入式学习L6网络编程D3TCP
  • 百度百科更新!树莓集团宜宾项目的深远影响与意义
  • 【Azure 架构师学习笔记】- Azure Databricks (19) --Lakehouse
  • 我与DeepSeek读《大型网站技术架构》(10)- 维基百科的高性能架构设计分析
  • 中国证监会主席吴清:进一步优化差异化安排 更精准支持优质科技企业上市
  • VMware下载安装Ubuntu详解
  • 无头浏览器与请求签名技术-Cloudflare防护
  • Manus 演示案例:小红书笔记创作指南
  • 【UNIAPP】获取视频的第一帧作为封面(基于视频URL,Canvas)复制即用
  • JAVA面试_进阶部分_Ibatis与Hibernate的区别
  • ORB-SLAM2源码学习:总结篇(二)三大线程
  • Redis四种模式在Spring Boot框架下的配置
  • 深度解析:如何在 Vue 3 中安全访问子组件实例
  • 《Python基础教程》附录B笔记:Python参考手册
  • 掌握 ArcGIS Pro:古地图制作技巧与方法
  • 2025华为昇腾CANN训练营 2.0 之旅
  • windows下玩转vllm:vllm简介;Windows下不能直接装vllm;会报错ModuleNotFoundError: No module named ‘vllm._C‘
  • 我要用新浪云做网站/如何宣传推广产品
  • 四川省建设厅网站打不开/樱桃bt官网
  • 上海大型网站建设/搜索引擎公司排名
  • 网站空间付款方式/永久免费客服系统
  • 企业怎么做网站建设/湖南seo优化报价
  • 模板网站 建设教材/痘痘怎么去除效果好