【问题标题】:C++ erasing part of the end of a vector without reallocationC ++擦除向量末尾的一部分而不重新分配
【发布时间】:2014-07-28 21:25:12
【问题描述】:

查看 C++ 向量文档,pop_back() 是一个不会导致向量数据重新分配的函数。但是,这仅适用于删除向量的一个成员。我正在尝试找到一种从向量末尾删除多个成员的方法。最初我以为我会在一个小的 for 循环中调用 pop_back() 但我在徘徊是否有更方便的函数可以为我做这件事?

编辑: Cplusplus vector erase() reference 并不像 juanchopanza 指出的那样清晰。这就是我最初使用erase() 丢弃的原因。毕竟擦除,效果很好。

【问题讨论】:

  • @juanchopanza Erase 会导致重新分配。
  • @juanchopanza 我在这里读到cplusplus.com/reference/vector/vector/erase“擦除除向量端以外的位置的元素会导致容器在擦除段后将所有元素重新定位到它们的新位置。”
  • 这是一个令人遗憾的误导性引用(cplusplus.com 的引用)。如果它重新分配,它就无法保持迭代器的有效性和对第一次擦除之前元素的引用。
  • @sgtHale:首先你混淆了重新分配(erase 没有完成)和元素的可能移动/复制超过最后一个删除的元素。 relocate 不同于 reallocate

标签: c++ memory-management vector


【解决方案1】:

使用vector::erase。它不会重新分配内存。

如果您擦除的范围没有延伸到容器的末尾,它将重新定位结束元素。这意味着结束元素将是 moved 到它们在内存中的正确位置,这可能会导致数据复制。这与重新分配后备存储不同。如果您的结束元素是myVector.end(),则不需要进行重定位。

【讨论】:

    【解决方案2】:

    您可以使用成员函数erase。向量不会被重新分配,因为根据 C++ 标准,例如C++17 n4659 standard draft 26.3.11.5 [vector.modifiers] “向量修饰符”:

    iterator erase(const_iterator position);
    iterator erase(const_iterator first, const_iterator last);
    

    3 效果:在擦除点或之后使迭代器和引用无效

    引号的粗体部分表示向量不会被重新分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2015-01-20
      • 2017-05-22
      • 2011-05-30
      相关资源
      最近更新 更多