STL容器类:数组
STL container class: array
我只是在探索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::array
和std::vector
之间的区别,这是因为std::array
旨在存储元素而不使用堆,为本地C风格数组提供了相同的性能替代方案,而std::vector
使用堆来存储元素,这允许更大的灵活性,但也会付出代价。关于std::array
和std::vector
之间更详细的比较,请参阅我的回答。
std::array
的max_size
方法的存在只是为了让它看起来像其他STL容器。通过与其他容器具有通用接口,array
s、vector
s和list
s可以使用大部分相同的代码。
当然,由于array<T, N>
的大小是类型的一部分,因此size
和max_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来说是一本好书。
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- std::数组派生类聚合初始化
- 包含不同大小静态数组的类的多个实例
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- 如何将移动平均线写入数组列表类?
- 如何使用对象数组访问类中的变量?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 具有使用其他类对象的数组的类
- C++自定义数组容器动态大小
- 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc
- 动态数组模板类:ostream&运算符友元函数的问题
- 如何在具有指向对象的指针数组的类中创建复制构造函数和析构函数,其中对象本身具有指向整数的指针数组
- 如何在C 中创建对象数组或类数组
- 如何将二维数组作为类中的私有变量,然后在构造函数中设置它
- 在标准C++中复制 C++/CLI 多维数组模板类
- 使用带有对象的数组调用类中的方法,错误"non-class type",c++
- 何时从数组删除类指针
- C 如何用数组在类中创建子类
- 具有2d数组的类中的否定运算符重载
- 动态字符串数组容器类在delete[]时挂起