distance在函数 int_stl的advance和distance的用法

#include &ltiostream&gt

#include &ltalgorithm&gt

#include &ltlist&gt

#include &ltiterator&gt

#include &ltboost/assign/std/list.hpp&gt

using namespace std;

using namespace boost::assign;

int main()

{

list&ltint&gt i;

i += 1,2,3,4,5,6,7,8,9,0;

copy(i.begin(),i.end(),ostream_iterator&ltint&gt(cout,"."));

cout&lt&ltendl;

list&ltint&gt::iterator itr = i.begin();

advance(itr,2);

cout&lt&lt"itr forward two is: ";

cout&lt&lt*itr&lt&ltendl;

itr = i.begin();

list&ltint&gt::iterator _itr = i.end();

cout&lt&lt"the dinstance bewtreen itr and Itr is: ";

cout&lt&ltdistance(itr,_itr)&lt&ltendl;

system("PAUSE");

return 0;

}

这里说的STL其实是SGI STL,下面所有的STL字样都是指的SGI STL,我的STL代码其实就是Dev-C++里面带的。好了废话也差不多说完了,现在正式开始,请把刀拿好,上STL

首先来看看 STL中的distance实现(目录就是%include%/c++/bits)

template&lttypename _InputIterator&gt

inline typename iterator_traits&lt_InputIterator&gt::difference_type

__distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)

{

// concept requirements

__glibcpp_function_requires(_InputIteratorConcept&lt_InputIterator&gt)

typename iterator_traits&lt_InputIterator&gt::difference_type __n = 0;

while (__first != __last) {

++__first; ++__n;

}

return __n;

}

template&lttypename _RandomAccessIterator&gt

inline typename iterator_traits&lt_RandomAccessIterator&gt::difference_type

__distance(_RandomAccessIterator __first, _RandomAccessIterator __last,

random_access_iterator_tag)

{

// concept requirements

__glibcpp_function_requires(_RandomAccessIteratorConcept&lt_RandomAccessIterator&gt)

return __last - __first;

}

其中__distance的两个重载版本分别是为了支持输入迭代器(不支持随机访问)和随机访问的迭代器,而我们使用得到的是下面这个distance

template&lttypename _InputIterator&gt

inline typename iterator_traits&lt_InputIterator&gt::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对象的创建这两个调用消除掉,与函数重载相似的东西就是函

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值