这么简单的问题.
templateOutputIt copy_n(InputIt first, Size count, OutputIt result);
为什么std::copy_n
要为要复制的元素数量而不是简单地采用一种类型std::size_t
?我只是想不出一个理由.
templateOutputIt copy_n(InputIt first, std::size_t count, OutputIt result);
Cheers and h.. 6
在这种情况下推测原始理论基本上是徒劳的,但是这种设计copy_n
可以用例如int
或ptrdiff_t
类型的负数来调用,在这种情况下它根本就什么都不做,而且对于标准化委员会的成员来说肯定已经清楚了.是非常称职的人.
另一个优点是,对于特殊的迭代器,例如输入和输出迭代器,大小可能比任何可能的指针差异大,因此可能大于size_t
可以表示的大小.例如,对于32位Windows中大于4GB的文件,情况就是如此.定义copy_n
用表观指针/迭代器算术表示,"对于每个非负整数i < n
,执行*(result + i) = *(first + i)
",这看起来似乎将这种优势降级到非常特殊的情况,但符号适用于纯输入和输出迭代器,如
"在操作员的算法的描述
+
和-
用于一些迭代器类别为其中它们没有被定义.在这些情况下,语义与.的语义a+n
相同X tmp = a; advance(tmp, n); return tmp;和那个
b-a
是一样的return distance(a, b)
;
设计的通用性没有固有的优势,相反,它本身就是一个缺点,因为它更冗长,并且对不正确的使用代码产生不太容易理解的诊断.它的优点包括上面列出的两个.显然,委员会认为这些优势,或许还有其他(?),超过了Size
作为模板参数的固有缺点.
在这种情况下推测原始理论基本上是徒劳的,但是这种设计copy_n
可以用例如int
或ptrdiff_t
类型的负数来调用,在这种情况下它根本就什么都不做,而且对于标准化委员会的成员来说肯定已经清楚了.是非常称职的人.
另一个优点是,对于特殊的迭代器,例如输入和输出迭代器,大小可能比任何可能的指针差异大,因此可能大于size_t
可以表示的大小.例如,对于32位Windows中大于4GB的文件,情况就是如此.定义copy_n
用表观指针/迭代器算术表示,"对于每个非负整数i < n
,执行*(result + i) = *(first + i)
",这看起来似乎将这种优势降级到非常特殊的情况,但符号适用于纯输入和输出迭代器,如
"在操作员的算法的描述
+
和-
用于一些迭代器类别为其中它们没有被定义.在这些情况下,语义与.的语义a+n
相同X tmp = a; advance(tmp, n); return tmp;和那个
b-a
是一样的return distance(a, b)
;
设计的通用性没有固有的优势,相反,它本身就是一个缺点,因为它更冗长,并且对不正确的使用代码产生不太容易理解的诊断.它的优点包括上面列出的两个.显然,委员会认为这些优势,或许还有其他(?),超过了Size
作为模板参数的固有缺点.