为什么std :: copy_n采用模板参数而不是std :: size_t?

时间:2015-12-30 02:48:49

标签: c++ c++11

这么简单的问题。

template<class InputIt, class Size, class OutputIt>
OutputIt copy_n(InputIt first, Size count, OutputIt result);

为什么std::copy_n会为要复制的元素数量而不仅仅是std::size_t采用类型?我只是想不出一个理由。

template<class InputIt, class OutputIt>
OutputIt copy_n(InputIt first, std::size_t count, OutputIt result);

2 个答案:

答案 0 :(得分:6)

在这种情况下,推测原始基本原理几乎是徒劳的,但是使用此设计可以调用负数,例如copy_nptrdiff_tsize_t类型,在这种情况下它根本不做任何事情,对于标准化委员会的成员来说肯定是清楚的,他们是非常称职的人。

另一个优点是,对于特殊的迭代器,例如输入和输出迭代器,大小可能比任何可能的指针差异大,因此可能大于copy_n。例如。对于32位Windows中大于4GB的文件,情况也是如此。 i < n的定义用明显的指针/迭代器算术表示,“对于每个非负整数*(result + i) = *(first + i),执行+”,这似乎将这个优势降级为非常特殊确实如此,但符号包含纯输入和输出迭代器,如

中所述 C ++11§25.1/ 12:
  

在算法的描述中,运算符-a+n用于某些迭代器类别   它们不必定义。在这些情况下,X tmp = a; advance(tmp, n); return tmp; 的语义与

的语义相同
b-a
     

return distance(a, b)的内容与Size相同;

设计的通用性没有固有的优势,而是它本身就是一个缺点,因为它更加冗长,并且对不正确的使用代码产生不太容易理解的诊断。它的优点包括上面列出的两个。显然,委员会认为这些优势,或许还有其他(?),超过了以{{1}}作为模板参数的固有缺点。

答案 1 :(得分:3)

我猜这是因为通用性 C ++中的容器size_type通常为size_t。但是,如果您使用自定义容器,或使用自定义分配器,那么可能不是模板参数。

对于custom containersize_type不一定是size_t的typedef(必须是an unsigned integer large enough to represent all positive values of difference_type)。

对于STL容器,size_typeallocator::size_type的typedef,default allocatorsize_t。但是,如果指定自定义分配器,则类型可能不同。