1. 迭代器的本质
(1) 标准要求
-
C++ 标准要求
std::string
和std::vector
的迭代器必须是 随机访问迭代器(Random Access Iterator)。 -
指针天然满足随机访问迭代器的所有操作(如
++
、--
、+n
、*
等),因此可以直接用指针实现。
(2) 典型定义
cpp
// vector 和 string 的迭代器通常类似以下形式 typedef T* iterator; // 非常量迭代器 typedef const T* const_iterator; // 常量迭代器
2. MSVC 的实现
(1) std::vector
迭代器
-
直接使用指针:
cpp
template<class T> class vector { public:typedef T* iterator;typedef const T* const_iterator;// ... };
-
Debug 模式增强:
-
在 Debug 模式下,MSVC 会用封装类(如
_Checked_iterator
)包裹指针,添加边界检查和迭代器校验。
-
(2) std::string
迭代器
-
类似
vector
:cpp
typedef char* iterator; // 非常量迭代器 typedef const char* const_iterator;
-
Debug 模式:
-
同样会封装为安全迭代器,防止越界访问。
-
3. GCC 的实现
(1) std::vector
迭代器
-
直接使用指针:
cpp
template<class T>class vector {public:typedef T* iterator; typedef const T* const_iterator;// ... };
-
无 Debug 封装:
-
GCC 默认不添加调试校验,迭代器就是原生指针。
-
(2) std::string
迭代器
-
依赖 SSO 实现:
-
短字符串(SSO):迭代器指向内部缓冲区(如
_M_p
)。 -
长字符串:迭代器指向堆内存。
cpp
typedef char* iterator; typedef const char* const_iterator;
-
4. 关键差异
特性 | MSVC | GCC |
---|---|---|
迭代器类型 | 指针或调试封装类 | 直接使用指针 |
Debug 校验 | 有(防止越界和失效迭代器) | 无 |
性能影响 | Debug 模式较慢,Release 无差异 | 始终高效 |