STL容器类:数组

时间:2012-03-17 02:04:46

标签: c++ stl

我只是在C ++中探索STL容器。有一些问题...... 有两个成员函数max_size()和size()。他们似乎在做同样的事情。我最初认为max_size()是数组的实际大小,而size()是显式存储的元素数。但是当我测试它时,事实并非如此。那为什么两个不同的功能?

我是否可以在任何地方阅读Java中的容器设计规范(不是功能描述)?我似乎有很多问题,例如为什么std :: array大小是固定的但是不能像std :: vector那样动态地改变等。显然,这样的设计决策有一个或另一个原因。阅读此类设计规范以理解这些限制将是有用的。我有一个旧的“有效STL”,它不包括std :: array。我相信Scott meyers尚未包含std :: array。

3 个答案:

答案 0 :(得分:5)

根据标准中的规定,max_size()是容器可能存储的最大元素数:

  

distance(begin(), end())表示最大容器

(C ++ 11,[container.requirements.general],表96)

对于array,它是一个固定大小的容器,它与size()重合,而对于动态容器则完全不同,例如std::vector(它将返回类似于虚拟地址空间的大小除以元素的大小。)

您可以在C ++标准中找到容器的所有规格(这是非常昂贵的,但其草稿可以在线免费获得),尽管它只是一个规范性规范,往往不能很好地解释某些决策背后的基本原理(和对容器的实施故意含糊不清)。

但是,对于std::arraystd::vector之间的差异,这是因为std::array旨在存储元素而不求助于堆,从而提供与本地C相同的性能替代方案样式数组,而std::vector使用堆来存储元素,这允许更多的灵活性,但需要付出代价。有关std::arraystd::vector之间更详细的比较,请参阅this answer of mine

答案 1 :(得分:3)

仅存在max_size std::array方法,使其看起来像其他STL容器。通过与其他容器建立通用接口,许多相同的代码可用于arrayvectorlist s。

当然,由于array<T, N>的大小属于该类型,sizemax_size必须返回相同的值N

答案 2 :(得分:1)

Re:我最初认为max_size()是数组的实际大小,而size()是显式存储的元素数。

我认为你将vector :: capacity()与max_size()混淆了。 在我的计算机(32位)中,对于int类型max_size = 1073741823,对于double类型max_size = 536870911.which表示4G = 2 ^ 32 = 1073741823 * sizeof(int)= 536870911 * sizeof(double)。 所以,max_size =你可以在你的电脑中使用的最大尺寸(无用!只是为了兼容):)

Re:有没有什么地方可以像Java一样阅读容器的设计规范(不是功能描述)? 也许&gt;带注释的STL源&lt;对你来说不是最好的,但这对STL来说是一本好书。