我正在探索 C++ 中的 STL 容器。有一些问题... 有两个成员函数
max_size()
和size()
。他们似乎在做同样的事情。我最初认为 max_size()
是数组的实际大小,size()
是显式存储的元素数量。但当我测试了一下,情况并非如此。那为什么有两个不同的功能呢?
有没有地方可以像Java一样阅读容器的设计规范(而不是功能描述)?我似乎有很多问题,例如为什么
std::array
的大小是固定的,但不能像 std::vector
那样动态更改等。显然,这样的设计决策必须有这样或那样的原因。阅读此类设计规范以了解此类限制将很有用。我有一份旧的“Effective STL”,其中不包括std::array
。我相信斯科特·迈耶斯尚未将 std::array
包含在其中。
按照标准规定,
max_size()
是容器可能存储的最大元素数量:
尽可能最大的容器distance(begin(), end())
(C++11,[容器.要求.一般],表 96)
对于固定大小的容器
array
,它与size()
一致,而对于动态容器,例如std::vector
,它完全不同(它将返回类似于虚拟地址空间的大小除以元素的大小)。
你可以在 C++ 标准中找到容器的所有规范(这是相当昂贵的,但它的草案可以在网上免费获得),尽管它只是一个规范性规范,往往不能很好地解释某些决定背后的基本原理(并且是故意的)对容器的实现含糊其辞)。
不过,对于
std::array
和 std::vector
之间的区别,这是因为 std::array
旨在存储元素而不诉诸堆,为本地 C 风格数组提供相同性能的替代方案,而 std::vector
使用堆来存储元素,这提供了更大的灵活性,但需要付出一定的代价。请参阅我的这个答案,了解 std::array
和 std::vector
之间的更详细比较。
max_size
的std::array
方法的存在只是为了让它看起来像其他STL容器。通过与其他容器建立通用接口,大部分相同的代码可用于 array
、vector
和 list
。
当然,由于
array<T, N>
的大小是类型的一部分,因此 size
和 max_size
必须返回相同的值,N
。
回复:我最初认为 max_size() 是数组的实际大小,size() 是显式存储的元素数量。
我认为你混淆了 vector::capacity() 和 max_size()。 在我的电脑(32位)中,对于int类型max_size=1073741823,对于double类型max_size=536870911。这意味着4G=2^32=1073741823*sizeof(int)=536870911*sizeof(double)。 所以,max_size=你的电脑可以使用的最大尺寸(没用!只是为了兼容):)
回复:有没有地方可以像Java一样阅读容器的设计规范(不是功能描述)? 也许>带注释的 STL 源代码< is not best for u,but it's a good book for STL.