迭代器类型萃取:标准库算法的'眼睛'
为什么需要迭代器类型萃取?
C++ 标准库算法(如 std::sort, std::find)是泛型函数,需要根据不同迭代器的能力调整实现逻辑。例如:
sort 对随机访问迭代器(如 vector::iterator)使用快速排序(O(n log n)),但对双向迭代器(如 list::iterator)无法使用,因为后者不支持随机访问。
为了让算法'知道'迭代器的能力,C++ 引入了 std::iterator_traits 模板,用于提取迭代器的类型信息。
std::iterator_traits 的工作原理
std::iterator_traits 是一个模板结构体,它从迭代器类内部提取预定义的类型别名。如果迭代器类没有提供这些别名,std::iterator_traits 会编译失败。
核心类型别名(必须由迭代器类提供)
| 类型别名 | 含义 | 示例 |
|---|---|---|
value_type | 迭代器指向的元素类型 | int |
difference_type | 迭代器之间的距离类型 | std::ptrdiff_t |
pointer | 指向元素的指针类型 | int* |
reference | 元素的引用类型 | int& |
iterator_category | 迭代器能力标签 | std::random_access_iterator_tag |
实际示例:自定义迭代器必须提供这些别名
class MyIterator {
public:
// 必须提供这 5 个类型别名,否则 std::iterator_traits 编译失败
using value_type = int;
using difference_type = std::ptrdiff_t;
using pointer = int*;
using reference = int&;
using iterator_category = std::random_access_iterator_tag;
// ... 迭代器操作实现
};
为什么 std::sort 需要这些别名?
value_type用于声明临时变量(如value_type tmp = *it)。
