为什么 std::array 中的 size_type 是 size_t,而 std::vector 中的也通常是 size_t?

8
文档说明,std::vectorsize_type通常为size_t,这是合理的,因为实现可以选择使用不同的类型。但是,为什么在std::arraysize_type=size_t呢?特别是在小型µC上经常使用std::array,让实现有些自由可能更好。这是文档错误吗?

1
你指的是什么文档?不同的 C++ 供应商有不同的 STL 实现,具有不同的文档和扩展。我不知道任何一个单一的“官方”STL文档(也无关紧要,因为供应商/STL特定的文档总是优先考虑)。 - Dai
4
根据C++标准规定,std::array<T,N>::size_typesize_t - Daniel Langr
@DanielLangr 是的,权威来源没错 - 但我不会把ISO规范描述为“文档”,因为规范通常对用户来说并不是有用的参考资料,而是供应商使用的。 - Dai
3
我猜测这与模板参数 N 同样被指定为 size_t 有关,以及因为 std::array 只是简单地包装了一个本地的 C++ 数组(尽管规范没有要求这样做,按我的阅读),如果 size_type 可以是除了 size_t 之外的其他类型,那么就会使事情变得复杂,并暗示着索引运算符在将索引参数用作本地数组的偏移量之前对其进行了一些处理。但除此之外,我不知道其他原因 :) 而在 vector<T> 中不适用这些限制。 - Dai
1
如果我使用违反ISO C++规范的C++编译器,那么我知道这是不对的 - 但它是我的编译器,所以我仍然必须遵守它的行为 - 即使它是“错误”的。而且,如果它的错误性允许我更快地发货并获得甜蜜的客户基础,那么做错事感觉就是正确的 :) - Dai
显示剩余4条评论
1个回答

2

这样定义是因为size_t被定义为足以容纳所有数组的大小。如果你想要一个更小的类型来处理较小的数组,你可以根据constexpr的值在适当的时候进行缩小。

template <typename Array>
struct small_array_size
{
    using type = size_t
};

template <typename T, size_t N, typename = std::enable_if_t<N < 256>>
struct small_array_size<std::array<T, N>>
{
    using type = uint8_t;
};

template <typename T, size_t N, typename = std::enable_if_t<N < 65536>>
struct small_array_size<std::array<T, N>>
{
    using type = uint16_t;
};

template <typename Array>
using small_array_size_t = typename small_array_size<Array>::type;

这一切都没问题,但我想知道为什么标准(cppreference)说数组中的size_type必须是size_t的别名? - wimalopaan
@wimalopaan,因为委员会决定采用这种方式。更令人惊讶的是 container::size_type 竟然存在,而不是在所有地方都使用 size_t - Caleth
是的,因为 container::size_type 存在,它不应该被固定为 size_t。std::vector 的措辞是“通常为 size_t”。我建议 std::array 使用相同的措辞。所以我认为这是措辞上的缺陷而不是故意的。 - wimalopaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接