【问题标题】:Is std::vector::reserve(0); legal?是 std::vector::reserve(0);合法的?
【发布时间】:2015-01-04 14:32:03
【问题描述】:

std::vector::reserve(0); 合法吗?它会做什么?

【问题讨论】:

  • 我相信这是合法的,而且可能什么都不做。
  • 我们可以安全地假设大小(以及更相关的容量)为零或更大。
  • @MikeSeymour 是的,我想说点别的,但结果不对。我刚刚删除了那部分。 :P

标签: c++ c++11 vector stl


【解决方案1】:

没有什么可以禁止的。 reserve的效果是:

reserve() 之后,capability() 大于等于reserve 的参数,如果 发生重新分配;否则等于 capacity() 的前一个值。发生重新分配 此时当且仅当当前容量小于reserve()的参数。1

由于capacity() 的值永远不能小于0(它是无符号的),这永远不会有任何影响;它永远不会导致重新分配。


1. c++标准,[vector.capacity]

【讨论】:

  • 我假设您在这里引用 C++ 标准?我认为您应该明确地说出来并提供所引用标准的版本。
  • 好吧,但我仍然认为您应该明确声明您正在为稍后遇到您的答案的其他用户引用 C++ 标准。
  • @NPS:我认为大多数可能关心的人都会认出[vector.capacity] 参考,但使参考更完整一点显然并没有什么坏处,所以我已经编辑了。
【解决方案2】:

是的,这是合法的禁止操作。

如果new_cap 大于当前capacity(),则分配新的存储空间,否则该方法不执行任何操作。

Source,强调我的。)

由于capacity() 将始终>= 0(由于size_type 是无符号的),因此传递零保证不会执行任何操作。

【讨论】:

    【解决方案3】:

    根据 C++ 标准

    reserve() 之后,capacity() 大于等于 如果发生重新分配,则保留;并且等于之前的值 容量()否则。 重新分配此时发生当且仅 如果当前容量小于reserve()的参数

    因此,如果reserve 的参数等于0,则根本不会重新分配。

    函数本身只在一种情况下抛出异常

    如果 n > max_size(),则抛出:length_error。

    考虑到reserve( 0 ) 不等于resize( 0 )。在最后一种情况下,向量的所有元素都将被删除。

    【讨论】:

      【解决方案4】:

      这是合法的,不会保留空间。虽然如果调用低于其容量,调用将不会执行任何操作。

      【讨论】:

      • 如果reserve的参数小于等于当前容量,reserve是空操作。由于容量不能为负数,所以0 不可能严格大于。
      • 你有一个错字:“then”而不是“than”。我想自己修复它,但它说编辑必须至少有 6 个字符长......白痴......
      【解决方案5】:

      documentation 对此提供了明确的答案:

      将容器的容量增加到大于或等于new_cap 的值。如果new_cap大于当前capacity(),则分配新的存储空间,否则该方法什么也不做。

      capacity() 返回一个不能为负的值。因此,为 new_cap 传递零总是属于第二类 - 即当函数什么都不做时。

      【讨论】:

      • 警告:没有一个 wiki 站点是“ 文档”
      【解决方案6】:
      void reserve (size_type n);
      

      如果 n 大于当前向量容量,该函数会导致容器重新分配其存储空间,将其容量增加到 n(或更大)。

      在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。

      【讨论】:

        【解决方案7】:

        首先,您应该尝试了解 Vector 的工作原理。它是一个保留内存的数组,以便在您需要存储新值以尝试更快更高效地执行插入操作时使用它。

        使用std::vector::reserve(),您可以确定要保留的内存量,在您的情况下为零。

        如果你想为你的向量添加另一个值并且保留空间为零,它会完全没有问题,但操作会更慢。如果您想对很多值执行此操作,可能会出现问题,但如果您只执行几次,您可能不会注意到这一点。

        【讨论】:

          猜你喜欢
          • 2020-09-22
          • 2013-06-18
          • 2012-05-27
          • 2010-12-17
          • 1970-01-01
          • 2021-05-17
          • 1970-01-01
          相关资源
          最近更新 更多