STL distance

distance模板函数的功能就是获取两个迭代器之间的元素个数,源码如下:

template<typename _InputIterator>
inline typename iterator_traits<_InputIterator>::difference_type
distance(_InputIterator __first, _InputIterator __last)
{
    return std::__distance(__first, __last, std::__iterator_category(__first));
}

内部调用了__distance函数,该函数唯一与distance接口有区别的地方就在于有个后面的迭代器类型的参数,在整个STL中,如果你在阅读源码的时候会经常发现这样的结构,即一个函数调用了另一个函数,而不同之处只在于这个多余的参数,即迭代器类型,这是由于对于一个函数功能,不同的迭代器类型他可以提供的接口是不一样的,使用这个迭代器类型作为函数参数就可以通过函数重载的方式进行不同函数实现的调用,也就是说这个参数对于实际实现程序是不相关的,他存在的意义仅在与作为一个选择功能;

那么对于__distance函数:

template<typename _InputIterator>
inline typename iterator_traits<_InputIterator>::difference_type
    __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)
{
    __glibcxx_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)
{
    return __last - __first;
}

整体来说__distance的实现就是上面的代码,对于不同的迭代器去获取begin和end之间的元素个数;

极其好用;

 

posted @ 2021-06-12 11:39  呵哈呵  阅读(43)  评论(0)    收藏  举报