关于c++的vector空间分配的问题

假如vector中存放100个string(不是指针类型string*,而是string),那么如果vector中的一个元素重新分配空间,会不会造成整个vector重新分配空间呢?假如代码如下:
vector *v1 = new vector(100);
v1[20].append("abc");
假设最后一句使v1[20]字符串超出原分配空间,根据string类型的算法,这个字符串会重新分配空间并复制数据,因为它属于v1的,而v1中的元素必须是连续的,所以是不是它也将会造成整个v1重新分配空间并复制数据呢?

 // ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> vec;
    vec.push_back("aaa");
    vec.push_back("bbb");
    vector<string>::iterator it;
    for (it = vec.begin(); it != vec.end(); it++)
        cout << (void *)&(*it) << endl;
    for (int i = 0; i < 100000; i++)
        vec[0].append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    for (it = vec.begin(); it != vec.end(); it++)
        cout << (void *)&(*it) << endl;
    return 0;
}

0063CFF8
0063D014
0063CFF8
0063D014
Press any key to continue . . .

第一个元素已经被追加了1千万个a,起码用了10M的内存,地址没有任何变化,可见根本和这个不相干。

你的代码在什么编译器下可以编译通过?

vector在你分配空间的时候,系统会默认分配大一点空间,比如你指定分配100个string的时候,系统可能会给你分配200个string的空间(根据IDE不同,分配的大小不同),当你的字符串超出100(自己分配的空间)而未超过200的时候,不会重新分配空间,但是当超出200(系统分配空间)的时候,会导致整个重新分配空间并复制数据。

翻一下C++ Premier就知道了。

我觉的应该会重新分配的吧,如果,vector是连续存放的吧,希望大牛指点

不会,你可以做一个实验嘛,看看前后向量中的元素的地址有没有改变。
string类型相当于一个指向字符数组的指针。而不是说它本身代表一块连续的空间。

 // ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> vec;
    vec.push_back("aaa");
    vec.push_back("bbb");
    vector<string>::iterator it;
    for (it = vec.begin(); it != vec.end(); it++)
        cout << (void *)&(*it) << endl;
    vec[0].append("aaaaaa");
    for (it = vec.begin(); it != vec.end(); it++)
        cout << (void *)&(*it) << endl;
    return 0;
}

0073CFF8
0073D014
0073CFF8
0073D014
Press any key to continue . . .

相邻的元素永远是28个字节。

其实要验证到底有没重新构造, 很简单.
自己写一个类, 在构造和析构函数中都输出日志, 不停的添加.
理论上每添加一次, 构造调用一次, 如果某次调用引起非常多的构造, 那就说明重新分配并创建新对象了.