0

我目前正在查看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));
}

据我所知,函数调用会消耗一定的时间,但这里的 iterator_category 是内联函数,与大多数主流编译器中的宏具有相同的效果。

使用 iterator_category() 的唯一不足可能是编译器由于 pass-by-const-reference 而生成的临时对象。

我对吗?或者有什么我还不认识的天才设计模式,有空告诉我!

4

1 回答 1

1

在实现中使用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&){ /*..*/ }
}

您可能会认为__distancein 也是如此__distance(first, last, category());,但带有的名称__是保留的,普通用户不能使用。

但是完全限定的调用可以解决这个问题(假设命名空间 sgi):

template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
  return __distance(first, last, ::sgi::iterator_category<InputIterator>(first));
}
于 2020-03-24T08:56:23.083 回答