C++ 如何从std::vector中删除元素而不调整其大小

C++ 如何从std::vector中删除元素而不调整其大小,c++,stl,C++,Stl,迭代器擦除(迭代器位置) 迭代器擦除(迭代器优先, 迭代器(最后) 删除从向量中删除的元素 容器可以是单个元素 (位置)或一系列元素 ([第一,最后) 这有效地减少了矢量 按元素数量确定大小 移除,调用每个元素的 之前的析构函数 以及: 除去 删除等于 范围中的给定值, 由[first,last]定义。删除是 通过移动中的元素来完成 以一种需要的方式排列 元素被覆盖。元素 在世界的新旧两端之间 范围保持不变。迭代器到 返回范围的新端点 是否有任何方法可以在不调整向量大小的情况下从迭代器范围内的s

迭代器擦除(迭代器位置)

迭代器擦除(迭代器优先, 迭代器(最后)

删除从向量中删除的元素 容器可以是单个元素 (位置)或一系列元素 ([第一,最后)

这有效地减少了矢量 按元素数量确定大小 移除,调用每个元素的 之前的析构函数

以及:

除去

删除等于 范围中的给定值, 由[first,last]定义。删除是 通过移动中的元素来完成 以一种需要的方式排列 元素被覆盖。元素 在世界的新旧两端之间 范围保持不变。迭代器到 返回范围的新端点

是否有任何方法可以在不调整向量大小的情况下从迭代器范围内的std::vector中移除元素(类似于移除,但从[first,last]移除所有元素)?我需要保持它在运行时达到的最大大小,以防止reallocs


谢谢!

我想您应该使用
reserve
功能在向量中为所需数量的项目保留空间

请看这里:

在从向量中删除项目之前,可以使用当前大小调用reserve以保持容量不变

请求更改容量

要求 分配给的存储空间 向量容器的元素位于 至少足够容纳n个元素

这将通知向量计划的 增大尺寸,但请注意 参数n表示最小值, 因此,产生的容量可能是任意的 容量等于或大于此值

当n大于电流时 容量,尝试重新分配 在调用此函数期间。如果 成功的话,它就不会再让你失望了 自动重新分配将发生 因为调用vector::insert或 向量::将_向后推,直到向量 尺寸至少超过n(此 保留上迭代器的有效性 所有这些未来的电话)

重新分配会使所有数据无效 以前获得的迭代器, 元素的引用和指针 向量

在任何情况下,对该函数的调用 从不影响包含的元素 在矢量中,也不是矢量大小 (为此,请参见vector::resize 或vector::erase,用于修改 向量大小和内容)


调整大小
永远不会减少向量的
容量
-您可以安全地使用
擦除

使用
reserve
为特定数量的项目预先分配向量空间。除非您实际超过此限制,否则任何
insert
erase
resize
都不会导致realloc。如果超过此限制,向量将在内部
保留更多空间,但不会降低内部容量。

iterator erase ( iterator first, iterator last );

这就是您想要做的。元素的析构函数被调用的事实与向量的最大大小(即容量)无关,而向量的最大大小通常不会减小。当您从向量中移除元素时,向量的大小(=包含的元素数)减小了,但容量在大多数情况下不会改变。

std::vector在减小其大小时并没有减小其容量。事实上,要缩小向量的容量,您需要使用带空向量的交换习惯用法。

我想您可能误解了向量容量与其大小之间的差异

容量是底层数组的实际大小,大小是该数组中实际使用的元素数

当您调用erase/remove时,您正在从数组中删除元素并向前移动项目。但是,大数组不会修改其容量。只会更改向量的大小字段(可能只是一个大小),以及一些元素的移动

一个简单的例子: 这是一个整数向量,容量为10,大小为4

| 1 | 2 | 4 | 8 |垃圾|垃圾|垃圾|垃圾|垃圾|垃圾

现在,假设我们要删除索引1处的项

操作类似于以下内容:

  • 销毁索引1处的项(在本例中为整数2)

  • 将索引1之后有效的所有元素向前移动,但需要许多位置来确保数组开头和最后一个有效项之间没有垃圾(在本例中,将所有元素向前移动1)

  • 将“大小”字段减少多少项被删除(在本例中为1)

  • 最后一个向量:
    | 1 | 4 | 8 |垃圾|垃圾|垃圾|垃圾|垃圾|垃圾|垃圾

    因为向量的容量没有改变,所以不需要重新分配任何数组


    我不能完全确定前移操作的语义,可能有一些对复制构造函数/赋值运算符重载的调用(如果有)当项目向前移动时。

    是的,但当我调用erase时,它会生成一个realloc。真的吗?为什么?我原以为它只会在想要减少容量的时候才会realloc。如果你指定了一个保留大小,那么它不会减少容量,因此也不会realloc。@Felics:不会。你需要区分
    大小
    (容器中的元素数)和
    容量
    (在不分配更多内存的情况下可以包含的元素数)。事实上,
    向量
    的容量永远不会缩小(因此我们需要使用以使其适合大小),所以您的问题不存在。@Luc Touraille我不知道向量在使用擦除时从不调整其容量。谢谢您提供的信息。我不知道大小。我想让向量在运行时调整其大小。@Felics:A vector wil