我目前正在查看SGI STL的源代码,特别是距离算法。
正如我所看到的,为了最大限度地提高效率,SGI使用了大量的内联模板来最小化运行时间。但我一点也不明白。
对于算法距离,SGI定义了一个模板:
template <class Iterator>
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&){
typedef typename iterator_traits<Iterator>::iterator_category category;
return category();
}
然后,它像一样定义了算法距离的公共接口
template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
typedef typename iterator_traits<InputIterator>::iterator_category category;
return __distance(first, last, category());
}
在你对我的知识做出所有判断之前,我想说的是,我理解STL的设计模式,我理解每一行的含义,我指的是语法。
但据我所知,我只是不知道SGI为什么没有像那样实现算法距离
template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
return __distance(first, last, iterator_category<InputIterator>(first));
}
据我所知,函数调用会消耗一定的时间,但在这里,迭代器_类别是内联函数,它与大多数主流编译器中的宏具有相同的效果。
使用迭代器_category((的唯一不足可能是编译器由于传递常量引用而生成的临时对象。
我说得对吗?或者有什么天才的设计模式我还没有认识,可以让我知道!
在实现中使用iterator_category<InputIterator>(first)
可能会被自定义迭代器的ADL劫持。
namespace HiJack
{
class MyIter{/*..*/};
template <class T> // would be not templated with call like iterator_category(first)
auto iterator_category(const MyIer&){ /*..*/ }
}
您可能认为__distance(first, last, category());
中的__distance
也是如此,但带有__
的名称是保留的,普通用户不能使用。
但是完全限定的调用将解决这个问题(假设名称空间sgi(:
template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
return __distance(first, last, ::sgi::iterator_category<InputIterator>(first));
}