STL容器类:数组

STL container class: array

本文关键字:数组 容器类 STL      更新时间:2023-10-16

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

有没有什么地方可以让我阅读Java中容器的设计规范(而不是功能描述)?我似乎有很多问题,比如为什么std::数组大小是固定的,但不能像std::vector那样动态更改。显然,这样的设计决策有这样或那样的原因。阅读这样的设计规范来理解这样的局限性是很有用的。我有一个旧的"有效STL",它不包括std::array。我相信Scott meyers还没有在其中包含std::array。

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

最大集装箱的distance(begin(), end())

(C++11,[集装箱要求概述],表96)

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

您可以在C++标准中找到容器的所有规范(这相当昂贵,但其草案可以在网上免费获得),尽管它只是一个规范性规范,往往无法很好地解释某些决策背后的基本原理(并且在容器的实现上故意含糊其辞)。

尽管如此,对于std::arraystd::vector之间的区别,这是因为std::array旨在存储元素而不使用堆,为本地C风格数组提供了相同的性能替代方案,而std::vector使用堆来存储元素,这允许更大的灵活性,但也会付出代价。关于std::arraystd::vector之间更详细的比较,请参阅我的回答。

std::arraymax_size方法的存在只是为了让它看起来像其他STL容器。通过与其他容器具有通用接口,arrays、vectors和lists可以使用大部分相同的代码。

当然,由于array<T, N>的大小是类型的一部分,因此sizemax_size必须都返回相同的值N

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

我认为u混淆了vector::capacity()和max_size()。在我的计算机(32位)中,对于int类型的max_size=1073741823,对于double类型的max_size=536870911.这意味着4G=2^32=1073748123*sizeof(int)=536870911*size of(double)因此,max_size=您的计算机中可以使用的最大大小(无用!仅用于兼容):)

回复:有没有什么地方可以让我阅读Java中容器的设计规范(而不是功能描述)?也许>注释STL源<对你来说不是最好的,但对STL来说是一本好书。