调整STL向量的大小会擦除/使其先前的内容无效吗?

bob*_*obo 9 c++ stl vector

它似乎不是(示例程序),但我能确定吗?

// does resizing an STL vector erase/invalidate it's previous contents?
#include <stdio.h>
#include <vector>
using namespace std ;

void print( vector<int>& t )
{
  for( int i = 0 ; i < t.size() ; i++ )
    printf( "%d ", t[i] ) ;
  puts("");
}

int main()
{
  vector<int> t ;
  t.resize( 12,9999 ) ;
  print(t) ;

  t.resize( 15, 10000 ) ;
  print(t) ;
}
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 18

调整STL向量的大小可能需要重新分配底层存储.这可能导致销毁和重新创建任意数量的元素,并且所有迭代器都将失效. 使用STL时,访问无效的迭代器是常见的错误来源.

除非复制构造函数不起作用,否则每个元素的内容都是相同的.

int main(int argc, char *argv[])
{
    int data[] = { 1, 2, 3 };

    std::vector vec(data, data + 3);
    // vector contains 1, 2, 3

    std::vector::iterator i = vec.begin();
    cout << *i << endl; // prints 1
    int &ref = *i;
    cout << ref << endl; // prints 1

    vec.resize(6, 99);
    // vector now contains 1, 2, 3, 99, 99, 99

    // WRONG! may crash, may do the wrong thing, might work...
    // cout << *i << endl;

    // WRONG! invalid reference
    // cout << ref << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,如果将向量调整为较小的大小,则只有擦除元素的迭代器才会失效.如果将向量的大小调整为仍然小于capacity()的值的大小,则不会发生迭代器失效(标准禁止).如果将向量的大小增加到大于容量的值,则向量元素的所有迭代器都将失效(). (8认同)

Jam*_*lis 9

resizestd::vector只有当新大小大于容器的当前容量(即v.capacity())时,才会使所有迭代器,指针和引用无效.

容器中的元素永远不会"失效".如果将容器的大小调整为小于其当前大小,则会破坏超出新大小的任何其他元素.

如果调整容器大小以使新大小大于当前容量并且需要重新分配基础存储,则会复制所有元素或将其移动到新分配的存储中.放大容器时,以前的元素始终保留,只是移动或复制到内存中的新位置.