【问题标题】:STL container class: arraySTL 容器类:数组
【发布时间】:2012-03-17 02:04:46
【问题描述】:

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

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

【问题讨论】:

  • 如果arrayvector 相同,则不需要两者之一,对吧?实际上,array 更接近于tuple 而不是vector。您可以从 GitHub 下载实际标准,以便您自己检查每个容器是什么。

标签: c++ stl


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      Re:我最初认为 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=你可以在你的电脑上使用的最大尺寸(没用!只是为了兼容):)

      Re: 有什么地方可以阅读 Java 中容器的设计规范(不是功能描述)? 也许>The Annotated STL Sources

      【讨论】:

      • 欢迎来到 StackOverflow!请保留会话文本给 cmets。这个问题是关于std::array,它是在C++11中标准化的,而不是std::vector。对于array,由于它尚不存在,因此不会在STL书籍中提及,size() == max_size()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多