1

我正在关注函数模板计数的示例,但我遗漏了一些东西。当然我没有完全理解 iterator_traits 并且我很困惑:

模板函数 COUNT 已声明为:

template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type  
   count (InputIterator first, InputIterator last, const T& val);

我的问题:

1)为什么使用 iterator_traits::difference_type ?该函数返回一个为什么不使用简单的对象:

template <class InputIterator, class T>
 T count(InputIterator first, InputIterator last, const T& val); 

我已经尝试过并且工作过。

2)如果我必须使用 iterator_traits,为什么我应该使用“不同的类型”(从另一个迭代器中减去一个迭代器)而不是“值类型”(迭代器可以指向的值)?

即使在这种情况下,我也尝试过并工作过。

我认为当函数返回 Iterator 时应该使用 iterator_traits,但后来我看到了模板函数 FIND,这让我更加困惑。

template <class InputIterator, class T>
 InputIterator find (InputIterator first, InputIterator last, const T& val);

而我会这样编码:

template <class InputIterator, class T>
 typename iterator_traits<InputIterator>::value_type 
  find( nputIterator first, InputIterator last, const T& val);

请有人能澄清这一点吗?

非常感谢您的任何帮助。

4

4 回答 4

1

std::count应该返回某个元素的计数,因此返回类型需要是整数类型,但T不一定是整数类型,因为它可以是任何东西(准确地说是元素的类型)。

于 2013-07-01T15:41:11.300 回答
1

1)std::count应该计算等于某事的事物。因此,例如,如果您的容器包含苹果,则返回苹果对象将没有用,因为苹果对于计数苹果没有用(至少不是我想到的那种苹果)

std::vector<Apple> apples = ...;
Apple an_apple;
auto n = std::count(apples.begin(), apples.end(), an_apple);

在这里,类型n必须是允许你计算大量潜在事物的东西。您正在计算Apple与 相同的对象数量an_apple

2)std::find必须给你一些可以用作容器元素句柄的东西,检查该元素是否存在。迭代器提供了一种很好的方法来做到这一点。返回一个值是没有意义的,因为a)您已经拥有您要查找的内容的副本,并且b)您通常不能返回一个“null”值来指示尚未找到一个元素。

于 2013-07-01T15:40:06.040 回答
0

为什么要 find() 返回您刚刚在 find() 函数中指定的对象?find 所做的是在容器内寻找一个存储您正在查找的对象的位置。

于 2013-07-01T15:53:49.847 回答
0

1)迭代器指向的值可以是任何值,不一定是可以表示计数的值。count 返回数值类型,选择的数值类型是迭代器的differ_type。

2) 同样,value_type 是迭代器指向的事物的类型,不一定是数值。

于 2013-07-01T15:39:05.650 回答