这是https://devdocs.io/cpp/algorithm/count_if中count算法的示例实现:
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
来跟踪计数。
答案 0 :(得分:2)
好吧,如果不了解有关迭代器的任何信息,就无法知道最好的足够大的类型,即两个迭代器之间的差异。
例如,如果迭代器迭代文件中的字节,该怎么办:
文件大小为64位,但是我们处于32位进程中。 std::size_t
不起作用,很可能unsigned
也不起作用。
因此,请std::iterator_traits
通常提供合适的类型。
现在,我们必须在其中使用typename
以确保编译器dependent qualified name std::iterator_traits<InputIt>::difference_type
将是一种类型。这对于澄清两阶段查找很重要。
答案 1 :(得分:0)
typename告诉编译器iterator_traits :: difference_type是class类型。
考虑一个易于理解的示例:
class ...
{
typename T::Something *p;
}
没有类型名,编译器可能会尝试创建一个静态成员,该成员将包含T :: Something乘以p;的结果。
在声明类型名时,编译器肯定会知道p是T :: Something类型的指针
希望这会有所帮助。