首页 文章

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

提问于
浏览
3

Cppreference只说:

从容器中删除指定的元素 . 1)删除pos处的元素 . 2)删除范围内的元素[first;持续) . 在擦除点或之后使迭代器和引用无效,包括end()迭代器 . 迭代器pos必须是有效且可解除引用的 . 因此,end()迭代器(有效但不可解除引用)不能用作pos的值 . 如果first == last,迭代器首先不需要是可解除引用的:擦除空范围是无操作 .

5 回答

  • 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() 确实如此 .

  • 7

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

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

  • 2

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

  • 4

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

    这里:

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

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

    只能减少容量数量是可能的,但我没有看到任何理智的实现 .

  • 4

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

    Allocator 概念中没有任何内容可以允许它更改分配大小,因此容量也不能以这种方式改变 .

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

相关问题