迭代器是容器与算法的桥梁,算法根据迭代器提供的信息来选择最合适的方法。
实现Distance()
遇到的问题:typename的使用,typename关键字用于引入一个模板参数,不加会报错
template <class It>
inline typename iterator_traits<It>::iterator_category
inerator_cagy(It&) {
typedef typename iterator_traits<It>::iterator_category cagy;
return cagy();
}
template <class Input_tag>
inline typename iterator_traits<Input_tag>::difference_type
_Mydistance(Input_tag& first, Input_tag& last, input_iterator_tag) {
typename iterator_traits<Input_tag>::difference_type n = 0;
while (first != last) {
++n;
++first;
}
cout << "inputIterator" << endl;
return n;
}
template <class random_tag>
inline typename iterator_traits<random_tag>::difference_type
_Mydistance(random_tag& first, random_tag& last, random_access_iterator_tag) {
cout << "random_access_iterator" << endl;
return last - first;
}
template <class It> inline
typename iterator_traits<It>::difference_type
Mydistance(It& first, It& last) {
typedef typename iterator_traits<It>::iterator_category cagy;
return _Mydistance(first, last, inerator_cagy(first));
}
void test() {
vector<int> v = {1,2,3,4};
cout << "vector<int>: " << Mydistance(v.begin(), v.end()) << endl;//random
list<int> l{1,2};
cout << "list<int>: " << Mydistance(l.begin(), l.end()) << endl;//binary
}