为什么 std::copy_n 采用模板参数而不是 std::size_t
Why does std::copy_n take a template parameter instead of std::size_t?
这么简单的问题。
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);
推测原始理由大多是徒劳的,但是通过这种设计,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
作为模板参数的固有缺点。
我猜这是因为通用性。size_type
C++的容器通常是size_t
的。但是,如果您使用自定义容器或使用自定义分配器,则可能不是这种情况,因此模板参数。
对于自定义容器,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,默认分配器size_t
。但是,如果指定自定义分配器,则类型可能会有所不同。
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- std::string.size() 未知行为
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 使用 std::size 来自非 const 上下文
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 为什么我必须在初始化 std::array<SomeStruct, size> 时指定每个项目的类型C++
- 为什么会出现错误:size不是std的成员
- 没有名为'size'在名称空间'std'
- std::具有initializer_list和size的unordered_map构造函数在main中编译,但不在类定
- 使用 constexpr 作为 std::array size
- std::span.size() vs array/vector size
- std ::向量距离函数如何给出比.size()更高的值
- 'std::out_of_range' what(): vector::_M_range_check: __n (即 0) >= this->size() (即 0)
- 在 c++ 中,std::string::size() 不计算修改后的字符串长度
- std::list.size() 如何具有恒定的复杂性?
- std::size 和 std::empty 的专业化与模板不匹配
- 为什么没有std::size
- 是否有一些像 std::size() 这样的函数