面试考察建议
- 入门问题:验证基础语法和概念理解。
- 进阶问题:考察类型系统、内存安全等核心知识。
- 高阶问题:测试对底层实现和泛型编程的理解。
一、入门
1、本质
指针:一种内置的数据类型,直接指向内存地址;指针主要用于操作数组或动态分配的内存块;
迭代器:一种抽象概念,是为了统一对不同容器的访问方式而设计的,它是容器提供的一种接口。迭代器适用于所有标准库容器,如 std::vector
、std::list
等。
2、迭代器和指针的共同点是什么?
解引用操作:均可通过*
访问指向的数据。
成员访问:都可以使用 ->
操作符来访问对象的成员
算术运算:支持自增(++
)、自减(--
)操作
// 指针遍历数组for (int *p = arr; p != arr + 3; ++p) {std::cout << *p;}// 迭代器遍历vectorfor (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()
)
- 与C库交互(如
-
必须用迭代器的场景
- STL算法操作(如
std::sort
) - 复杂容器遍历(如
std::map
的键值对访问)
- STL算法操作(如