Cppreference只说:
从容器中删除指定的元素。 1)删除元素 在pos。 2)删除范围内的元素[first;最后一个)。
在点或之后使迭代器和引用无效 擦除,包括end()迭代器。
迭代器pos必须是有效且可解除引用的。因此结束() 迭代器(有效但不可解除引用)不能用作 pos的值。
如果first == last:首先不需要解除引用迭代器: 删除空范围是一种无操作。
答案 0 :(得分:7)
不一定没有。当阅读C ++标准(和cppreference代表标准非常好)时,如果没有明确提到某些内容,那么假设不需要这样的东西。
对于C ++标准库实现来说,这可能是次优的。
答案 1 :(得分:4)
没有。这是因为擦除点之前的迭代器,指针和引用仍然有效。减少容量需要重新分配。
答案 2 :(得分:4)
使用其他约束作为复杂性或迭代器有效性,可能会以某种方式强制执行。
下面:
复杂性:
删除的元素数量(destructions)加上最后一个元素删除(移动)后的元素数量。
因此,减少容量和移动旧对象是不可能的调整大小的缓冲区。除first
和begin
相同的情况外。
可以减少容量数量,但我没有看到任何理智的实现。
答案 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()
肯定会减少。