【问题标题】:What is the correct value of max_size() for a fixed capacity custom STL container?固定容量自定义 STL 容器的 max_size() 正确值是多少?
【发布时间】:2012-12-02 10:06:24
【问题描述】:

我正在编写一个具有固定容量的自定义循环缓冲区实现(在运行时通过调用构造函数来修复,没有调整大小的方法)并希望它与 STL 兼容。 我的目标是使它成为Random Access Container。此外,我希望它具有Back Insertion Sequence 的特定接口,但不是序列(没有在任意位置调整大小和插入/擦除,...)。所以它只是一个扩展的随机访问容器。 看了一些关于ma​​x_size()size()的问题,我还是有点迷茫。

我目前的想法: size():缓冲区中包含的元素数
ma​​x_size():缓冲区的容量(可以容纳的最大元素数)

这是否正确(符合标准/STL)?还是我必须像 (std::)array 和 size() == max_size() 一样处理它?

【问题讨论】:

  • for std::array, size() == max_size() 因为数组的大小是固定的,所以它不能有比指定的更多或更少的对象(除非你使用手动调用析构函数等技巧,但是数组不知道你做了什么)。
  • 所以当你说“固定容量”时:根据你的意思是容量是在运行时通过将值传递给构造函数来固定,还是在编译时固定(要么一个硬- 库的编码值或作为模板参数)。
  • @SteveJessop:更新了问题以更清楚地说明这一点。容量在运行时是固定的。

标签: c++ stl


【解决方案1】:

标准对C++11 Table 96中max_size()的含义相当明确:

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

如果像std::array 一样,大小是容器类型的属性(例如,由模板参数指定),那么它应该与size() 相同。如果你可以实例化不同大小的相同类型,那么它应该是允许的最大大小。

我会按照标准容器的例子,并有一个capacity()函数告诉你容量。

【讨论】:

  • 对于“可能”的某些值——如果你为 SIZE_MAX 返回 SIZE_MAX,我不认为它实际上是违反标准的,而实际上全局 operator new 是无能的原则上使分配大于SIZE_MAX/2
  • 很好的解释。因此解决方案将是 size():缓冲区中的当前元素数,max_size():任何循环缓冲区 的最大大小的静态系统特定值,容量():最大值。此循环缓冲区实例的元素数
  • @EnnoGröper:或者,像std::array,创建一个circularbuffer<T,N> 并将N 返回为max_size。追随 STL 的脚步是不会错的 ;)
  • @MatthieuM.:谢谢,但在我的用例中,容量在编译时是未知的,并且在具有反向插入序列 size() 接口的容器中是可变的。我的容器更像 std::vector 而不是 std::array。
  • @EnnoGröper:我没有建议不要让size() 可变,我只是建议在编译时设置一个上限。如果这是不可能的,那么你当然不应该这样做;)
【解决方案2】:

max_size 与容器类型的特定实例无关。它是该类型可以处理的最大大小,具体取决于任何实现细节限制它(size_type 的最大值,如果没有别的)。

vector 可以保留当前未使用的空间,因此它具有capacity() 功能。不过,这不是任何容器概念的一部分,因为其他容器(dequelist)不保留空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多