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

时间:2012-03-06 21:00:34

标签: 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) ;
}

6 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:7)

当且仅当新大小大于容器的当前容量(即resize)时,

std::vector将使v.capacity()中的所有迭代器,指针和引用无效。

容器中的元素永远不会“失效”。如果您将容器的大小调整为小于其当前大小,则超出新大小的任何额外元素都将被销毁。

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

答案 2 :(得分:2)

调整向量大小不会破坏存储在向量中的值(当然,当缩小时超出新大小的值除外),但是超出其容量的向量增长将会复制(或者,在C ++ 11中,移动)它们到一个新的地方,从而使这些元素的迭代器,指针或引用无效。

在您的示例程序中,您不会在调整大小期间存储迭代器,指针或向量元素的引用,因此如果在调整大小期间复制了数据,则可以访问复制的值(这很可能,但不完全确定;向量可能为所需元素分配空间;实际上,在增长时,必须必须这样做才能满足复杂性要求。)

您可以通过成员函数capacity获取当前容量(在需要重新分配之前可以将其增加到的元素数)。只要向量不超出当前容量,即使迭代器,指针和对存储对象的引用也是安全的。此外,如果要确保没有迭代器,指针或引用无效,并且事先知道向量可能增长的最大大小,那么可以使用成员函数reserve预分配所有需要的内存。 / p>

答案 3 :(得分:0)

调整大小以复制数据。看一下这个http://www.cplusplus.com/reference/stl/vector/resize/

答案 4 :(得分:0)

内容仍然存在。如果向量的容量为1000,其中包含500个元素,并且您调整为2000,则将复制所有500个元素。如果将其大小调整为200,则仅复制前200个元素,并删除最后300个元素。

答案 5 :(得分:0)

有一个例子 Here

当您调整大小时,只需使用值填充新单元格。