繁体   English   中英

STL容器类:数组

[英]STL container class: array

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

有什么地方可以像Java一样阅读容器的设计规范(不是功能说明)? 我似乎有很多问题,例如为什么std :: array的大小是固定的,但是却不能像std :: vector这样动态地更改等。显然,这种设计决定有一个或另一个原因。 阅读此类设计规范以了解此类限制将非常有用。 我有一个旧的“有效STL”,其中不包含std :: array。 我相信Scott meyers尚未在其中包含std :: array。

按照标准中的规定, 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

仅存在std::arraymax_size方法,以使其看起来与其他STL容器类似。 通过与其他容器具有公共接口,许多相同的代码可用于array s, vector s和list s。

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

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

我认为您将vector :: capacity()与max_size()混淆了。 在我的计算机(32位)中,对于int类型,max_size = 1073741823,对于双精度类型,max_size = 536870911。这意味着4G = 2 ^ 32 = 1073741823 * sizeof(int)= 536870911 * sizeof(double)。因此,max_size =您可以在电脑中使用的最大尺寸(无用!仅用于兼容):)

回复:有什么地方可以阅读Java之类的容器设计规范(不是功能描述)? 也许> Annotated STL Sources <对您而言不是最好的选择,但对于STL来说却是一本好书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM