一、初识迭代器
C++ 容器类都定义了名为 iterator 的类型,该类型是指针或类。用户可以创建 iterator 类型的对象来访问容器(如下例1、2);另外C++标准库算法(Algorithm)等都需要借助迭代器访问容器(如下例3)。
int main()
{
/// 例(1) vector 迭代器
std::vector<int32_t> vec{78, 90, 66, 34};
std::vector<int32_t>::iterator it = vec.begin();
for (; it != vec.end(); ++it)
std::cout << *it << '\n';
/// 例(2) list 迭代器
std::list<int> li{9, 7, 80, 78};
std::list<int>::iterator liIt = li.begin();
for (; liIt != li.end(); liIt++)
std::cout << *liIt << std::endl;
/// 例(3) 算法借助迭代器访问容器
for_each(li.begin(), li.end(), [](const int &v){
std::cout << v << std::endl;
});
}
二、迭代器特性
C++ 标准要求迭代器必须为算法提供以下特性:
- iterator_category 迭代器类型
- value_type 元素类型
- difference_type 描述指针距离的类型
- pointer 元素指针类型
- reference 元素引用类型
iterator_category 包含 forward_iterator_tag、bidirectional_iterator_tag、 random_access_iterator_tag类型;difference_type 类型应保证足以存放同一数组中两个指针之间的差距, 有可能是负数;pointer 和 reference 暂时未被使用。
因为迭代器存在指针的情形,所以迭代器以上特性的获取需要借助模板偏特化如下:
#ifndef STL_NOTE_MY_ITERATOR_H
#define STL_NOTE_MY_ITERATOR_H
struct input_iterator_tag {};
//struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
template <typename Iterator>
struct my_iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
/// ... ///
};
template<typename I>
struct my_iterator_traits<I*> {
typedef random_access_iterator_tag iterator_category;
typedef I value_type;
typedef ptrdiff_t difference_type;
/// ...
};
#endif //STL_NOTE_MY_ITERATOR_H
void __print_category(random_access_iterator_tag) {
std::cout << "random_access_iterator\n";
}
template <typename I>
void print_category(I it) {
typename my_iterator_traits<I>::iterator_category category;
__print_category(category);
}
int main() {
print_category(my_vector<A>::iterator());
}
目前对迭代器的基本特点有一个认识,后续通过实现容器对迭代器进行深入了解。