zhuwt2008
zhuwt2008
采纳率95.1%
2015-04-20 00:42

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

已采纳

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

9条回答

  • caozhy 从今以后生命中的每一秒都属于我爱的人 6年前
     // 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的内存,地址没有任何变化,可见根本和这个不相干。

    点赞 评论 复制链接分享
  • xiaohuh421 xiaohuh421 6年前

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

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 6年前

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

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 6年前
     // 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 . . .

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 6年前

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

    点赞 评论 复制链接分享
  • wangyaninglm shiter 6年前

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

    点赞 评论 复制链接分享
  • ll2009301953 ll2009301953 6年前

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

    点赞 评论 复制链接分享
  • veno813 阿姨戏太露 6年前

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

    点赞 评论 复制链接分享
  • lx624909677 lx624909677 6年前

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

    点赞 评论 复制链接分享

相关推荐