#include <iostream>
#include <algorithm>
#include <list>
#include <iterator>
#include <boost/assign/std/list.hpp>
using namespace std;
using namespace boost::assign;
int main()
{
list<int> i;
i += 1,2,3,4,5,6,7,8,9,0;
copy(i.begin(),i.end(),ostream_iterator<int>(cout,"."));
cout<<endl;
list<int>::iterator itr = i.begin();
advance(itr,2);
cout<<"itr forward two is: ";
cout<<*itr<<endl;
itr = i.begin();
list<int>::iterator _itr = i.end();
cout<<"the dinstance bewtreen itr and Itr is: ";
cout<<distance(itr,_itr)<<endl;
system("PAUSE");
return 0;
}
这里说的STL其实是SGI STL,下面所有的STL字样都是指的SGI STL,我的STL代码其实就是Dev-C++里面带的。好了废话也差不多说完了,现在正式开始,请把刀拿好,上STL
首先来看看 STL中的distance实现(目录就是%include%/c++/bits)
template<typename _InputIterator>
inline typename iterator_traits<_InputIterator>::difference_type
__distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)
{
// concept requirements
__glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
typename iterator_traits<_InputIterator>::difference_type __n = 0;
while (__first != __last) {
++__first; ++__n;
}
return __n;
}
template<typename _RandomAccessIterator>
inline typename iterator_traits<_RandomAccessIterator>::difference_type
__distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
random_access_iterator_tag)
{
// concept requirements
__glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>)
return __last - __first;
}
其中__distance的两个重载版本分别是为了支持输入迭代器(不支持随机访问)和随机访问的迭代器,而我们使用得到的是下面这个distance
template<typename _InputIterator>
inline typename iterator_traits<_InputIterator>::difference_type
distance(_InputIterator __first, _InputIterator __last)
{
// concept requirements -- taken care of in __distance
return __distance(__first, __last, __iterator_category(__first));
}
其中distance就使用了__distance这个内部实现,现在来看看我们要修改的地方,其实就在distance的return语句中,__distance是个重载函数,其中的第三个参数需要调用__iterator_category这个模板函数,然后还要构造一个iterator_category(这只是一个“概念”名字)对象,这样来达到判断iterator_category的作用。
现在我们磨刀的动机就是把__iterator_category和iterator_category对象的创建这两个调用消除掉,与函数重载相似的东西就是函