算法为何使用iterator_traits<T>::value_type而非iter::value_type?
iterator_traits而不是直接用iter::value_type? 直接用iter::value_type在普通容器迭代器(比如vector<int>::iterator)上确实能正常工作,但算法实现必须依赖iterator_traits,核心原因是要兼容原生指针这种特殊的"迭代器",同时统一类型获取的接口:
原生指针没有嵌套类型:原生指针(比如
int*、char*)不是类/结构体类型,根本没有::value_type这样的嵌套成员。如果算法直接用iter::value_type,当传入指针时会直接编译报错。而iterator_traits针对原生指针做了特化处理,比如iterator_traits<int*>::value_type会被自动解析为int,让算法能像处理普通迭代器一样处理指针。
比如把你的代码改成传入数组指针:int arr[] = {1,2,3}; for_each(arr, arr+3);这时候
iter::value_type的写法会编译失败,但iterator_traits的写法能正常输出i(对应int)。统一接口,简化算法实现:不管迭代器是容器提供的类类型迭代器,还是原生指针,
iterator_traits<iter>::value_type都是通用的获取值类型的方式。算法不需要专门判断传入的是迭代器还是指针,代码逻辑更简洁,通用性更强。提供更多迭代器关联类型:
iterator_traits不止能获取value_type,还能提供difference_type(迭代器之间的距离类型)、pointer(迭代器指向的指针类型)、reference(迭代器引用的类型)、iterator_category(迭代器的类别,比如随机访问迭代器、双向迭代器等)。这些类型都是算法实现中经常需要的,比如根据迭代器类别选择更高效的遍历方式,计算迭代器之间的偏移等。
简单来说,iterator_traits是C++标准库为了让算法能兼容所有"迭代器-like"类型(包括原生指针)而设计的统一类型萃取工具,是算法通用性的关键。
内容的提问来源于stack exchange,提问作者Hardik

