这么简单的问题。
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);
答案 0 :(得分:6)
在这种情况下,推测原始基本原理几乎是徒劳的,但是使用此设计可以调用负数,例如copy_n
。 ptrdiff_t
或size_t
类型,在这种情况下它根本不做任何事情,对于标准化委员会的成员来说肯定是清楚的,他们是非常称职的人。
另一个优点是,对于特殊的迭代器,例如输入和输出迭代器,大小可能比任何可能的指针差异大,因此可能大于copy_n
。例如。对于32位Windows中大于4GB的文件,情况也是如此。 i < n
的定义用明显的指针/迭代器算术表示,“对于每个非负整数*(result + i) = *(first + i)
,执行+
”,这似乎将这个优势降级为非常特殊确实如此,但符号包含纯输入和输出迭代器,如
“在算法的描述中,运算符
的语义相同-
和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 container,size_type
不一定是size_t
的typedef(必须是an unsigned integer large enough to represent all positive values of difference_type
)。
对于STL容器,size_type
是allocator::size_type
的typedef,default allocator为size_t
。但是,如果指定自定义分配器,则类型可能不同。