vector :: erase会减少vector :: capacity吗?

时间:2018-05-30 08:12:18

标签: c++ vector language-lawyer

Cppreference只说:

  

从容器中删除指定的元素。 1)删除元素   在pos。 2)删除范围内的元素[first;最后一个)。

     

在点或之后使迭代器和引用无效   擦除,包括end()迭代器。

     

迭代器pos必须是有效且可解除引用的。因此结束()   迭代器(有效但不可解除引用)不能用作   pos的值。

     

如果first == last:首先不需要解除引用迭代器:   删除空范围是一种无操作。

5 个答案:

答案 0 :(得分:7)

不一定没有。当阅读C ++标准(和cppreference代表标准非常好)时,如果没有明确提到某些内容,那么假设不需要这样的东西。

对于C ++标准库实现来说,这可能是次优的。

答案 1 :(得分:4)

没有。这是因为擦除点之前的迭代器,指针和引用仍然有效。减少容量需要重新分配。

答案 2 :(得分:4)

使用其他约束作为复杂性或迭代器有效性,可能会以某种方式强制执行。

下面:

  

复杂性:
  删除的元素数量(destructions)加上最后一个元素删除(移动)后的元素数量。

因此,减少容量和移动旧对象是不可能的调整大小的缓冲区。除firstbegin相同的情况外。

可以减少容量数量,但我没有看到任何理智的实现。

答案 3 :(得分:2)

影响容量的唯一向量操作是使所有迭代器,指针和引用无效的操作,因为它们已重新分配存储并移动了元素。

Allocator概念中没有任何内容允许它更改分配大小,因此容量也不会以这种方式发生变化。

理论上,一个实现可以专注于std::allocator并重新分配,在" As-if"规则,但我怀疑有任何严肃的实施可以做这样的事情。

答案 4 :(得分:2)

一个简单的例子可以解决你的疑问:(使用VS2017编译)

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> intVec{ 1,2,3,4,5,6,7,8,9,10 };
    std::cout << "Capacity and size before erase : " << intVec.capacity() << ", "<< intVec.size() << std::endl;
    intVec.erase(intVec.begin() + 3);
    std::cout << "Capacity and size after erase : " << intVec.capacity() << ", " << intVec.size() << std::endl;
    return 0;
}
  

输出

     

擦除前的容量和大小:10,10

     

擦除后的容量和大小:10,9

请注意,虽然capacity()在删除后不会减少,但size()肯定会减少。