STL容器类:数组

问题描述 投票:0回答:3

我正在探索 C++ 中的 STL 容器。有一些问题... 有两个成员函数

max_size()
size()
。他们似乎在做同样的事情。我最初认为
max_size()
是数组的实际大小,
size()
是显式存储的元素数量。但当我测试了一下,情况并非如此。那为什么有两个不同的功能呢?

有没有地方可以像Java一样阅读容器的设计规范(而不是功能描述)?我似乎有很多问题,例如为什么

std::array
的大小是固定的,但不能像
std::vector
那样动态更改等。显然,这样的设计决策必须有这样或那样的原因。阅读此类设计规范以了解此类限制将很有用。我有一份旧的“Effective STL”,其中不包括
std::array
。我相信斯科特·迈耶斯尚未将
std::array
包含在其中。

c++ stl
3个回答
6
投票

按照标准规定,

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
之间的更详细比较。


4
投票

max_size
std::array
方法的存在只是为了让它看起来像其他STL容器。通过与其他容器建立通用接口,大部分相同的代码可用于
array
vector
list

当然,由于

array<T, N>
的大小是类型的一部分,因此
size
max_size
必须返回相同的值,
N


1
投票

回复:我最初认为 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.

© www.soinside.com 2019 - 2024. All rights reserved.