这是https://devdocs.io/cpp/algorithm/count_if:
template<class InputIt, class T>
typename iterator_traits<InputIt>::difference_type
count(InputIt first, InputIt last, const T& value)
{
typename iterator_traits<InputIt>::difference_type ret = 0;
for (; first != last; ++first) {
if (*first == value) {
ret++;
}
}
return ret;
}
我的问题是,typename iterator_traits<InputIt>::difference_type
的意义是什么
如果我实现了这一点,我会简单地使用unsigned int
来跟踪计数。
如果不了解迭代器,就无法知道最好的足够大的类型——两个迭代器之间的差异
例如,如果迭代器迭代文件中的字节:
文件大小是64位,但我们处于32位的过程中。std::size_t
不起作用,很可能unsigned
也不起作用。
因此,要求std::iterator_traits
一般性地提供合适的类型。
现在,我们必须在那里使用typename
来向编译器保证依赖限定名std::iterator_traits<InputIt>::difference_type
将是一个类型。这一点对于两相查找非常重要。
typename告诉编译器迭代器类型::difference_type属于类类型。
考虑一个更容易理解的例子:
class ...
{
typename T::Something *p;
}
如果没有typename,编译器可能会尝试创建一个静态成员,该成员将包含T::Something乘以p的结果;
而当你声明typename时,编译器肯定知道p是一个类型为T::Something 的指针
希望这能有所帮助。