【足迹C++primer】27、vector对象是如何增长的

vector对象是如何增长的

当需要更多空间的时候,会重新分配比新空间需求更大的内存空间,作为备用

管理容器的成员函数

shrink_to_fit   //只适用于vector,string,deque
capacity  reserve    //只适用于vector,string 

c.shrink_to_fit()   //请将capacity()减少为与size相同大小
c.capacity()        //不重新分配内存空间的话,c可以保存多少元素
c.reserve(n)        //分配至少能容纳n个元素的内存空间

capacity和size

size 是已经保存的元素的数目,capacity 是不分配新的内存空间的前提行下他可以保存多少个元素

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    vector<int> ivec;
    //size应该为0;capacity的值依赖于具体实现
    cout<<" ivec : size: "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;
    //向ivec添加24个元素
    for(vector<int>::size_type ix=0 ; ix != 24 ; ++ix)
        ivec.push_back(ix);

    //size应该为24;capacity应该大于或等于24,具体值依赖于标准库实现
    cout<<" ivec: size: "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;
}

得到的结果是:

 ivec: size: 0 capacity: 0
 ivec: size: 24 capacity: 32

现在可以预分配一些额外空间

ivec.reserve(50);       //将capacity至少设定为50,可能会更大
    //size应该为24;capacity应该大于等于50,具体值依赖于标准库
    cout<<" ivec :size: "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

输出结果是:

 ivec: size: 24 capacity: 50

接下来可以用光这些预留的空间

    //添加元素用光多余容量
    while(ivec.size() != ivec.capacity())
            ivec.push_back(0);
    //capacity应该未改变,size和capacity不相等
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;
 ivec: size: 50 capacity: 50

没有超出vector的容量那么就不会重新分配空间

 ivec.push_back(42); //添加一个元素
    //size的值现在应是51;capacity应该大于51,看以来的标准库
     cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;
 ivec: size: 51 capacity: 100

也可以用shrink_to_fit来要求vector将超出的多余内存退回给系统:

    ivec.shrink_to_fit();   //要求归还内存
    //size未变capacity应该看具体实现
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

结果是:

 ivec: size: 51 capacity: 51

//小题实例

    vector<int> ivec;
    //size应该为0;capacity的值依赖于具体实现
    //添加256个单词
    for(vector<int>::size_type ix=0 ; ix != 256 ; ++ix)
    {
        ivec.push_back(ix);
    }
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.resize(500);   //吧它capacity设定为至少500
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.shrink_to_fit();       //返回内存

    for(int ix=0 ; ix != 12 ; ++ix)
        ivec.push_back(ix);

    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

工作全代码!!!

/**
* 功能:vector对象时如何增长的
* 时间:2014年6月12日07:43:54
* 作者:cutter_point
*/

/*
shrink_to_fit   //只适用于vector,string,deque
capacity  reserve    //只适用于vector,string

c.shrink_to_fit()   //请将capacity()减少为与size相同大小
c.capacity()        //不重新分配内存空间的话,c可以保存多少元素
c.reserve(n)        //分配至少能容纳n个元素的内存空间
*/

#include<iostream>
#include<vector>

using namespace std;

int main()
{

    /*
    vector<int> ivec;
    //size应该为0;capacity的值依赖于具体实现
    cout<<" ivec : size: "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;
    //向ivec添加24个元素
    for(vector<int>::size_type ix=0 ; ix != 24 ; ++ix)
        ivec.push_back(ix);

    //size应该为24;capacity应该大于或等于24,具体值依赖于标准库实现
    cout<<" ivec: size: "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.reserve(50);       //将capacity至少设定为50,可能会更大
    //size应该为24;capacity应该大于等于50,具体值依赖于标准库
    cout<<" ivec :size: "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    //添加元素用光多余容量
    while(ivec.size() != ivec.capacity())
            ivec.push_back(0);
    //capacity应该未改变,size和capacity不相等
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.push_back(42); //添加一个元素
    //size的值现在应是51;capacity应该大于51,看以来的标准库
     cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.shrink_to_fit();   //要求归还内存
    //size未变capacity应该看具体实现
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;
        */

    vector<int> ivec;
    //size应该为0;capacity的值依赖于具体实现
    //添加256个单词
    for(vector<int>::size_type ix=0 ; ix != 256 ; ++ix)
    {
        ivec.push_back(ix);
    }
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.resize(500);   //吧它capacity设定为至少500
    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    ivec.shrink_to_fit();       //返回内存

    for(int ix=0 ; ix != 12 ; ++ix)
        ivec.push_back(ix);

    cout<<" ivec : size : "<<ivec.size()
        <<" capacity: "<<ivec.capacity()<<endl;

    return 0;
}

【足迹C++primer】27、vector对象是如何增长的,布布扣,bubuko.com

时间: 2024-10-21 14:37:39

【足迹C++primer】27、vector对象是如何增长的的相关文章

vector对象是如何增长的

C++的vector容器相当于提供了长度可变的数组.但是这个“数组”的长度是如何增长的呢? 详见C++ Primer(第五版),9.4节. 写了一个程序来测试 1 /* vector对象是如何增长的 2 * gcc version 4.8.1 3 */ 4 5 #include <iostream> 6 #include <vector> 7 8 using namespace std; 9 10 void printSizeCapacity(vector<int>&a

[c++面试准备]--vector对象是如何增长的

参考资料:cpp primer 5th 背景: 为了支持快速的访问,vector/string将元素连续存储--每个元素都是紧挨着前一个元素存储. 如果我们向vector/string中添加新的元素,会发生什么:由于连续存放的缘故,当没有多余的空间来容纳新的元素的时候,容器必须分配新的空间来保存已有的元素和新元素,将已有元素从旧位置移动到新空间中,然后添加新的元素,释放旧的空间. vector不会对新添加的每一个元素都做上述操作,效率太慢.所以vector会预留一些空间.就是因为这些预留的空间,

【足迹C++primer】38、关联容器操作(2)

关联容器操作(2) map的下标操作 map的下标操作 map和unordered_map容器提供了下标运算符合一个对应的at函数 对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同: 使用一个不再容器中的关键字作为下标,会添加一个此关键字的元素到map中 map和unordered_map的下标操作 c[k] 返回关键字为k的元素,如果关键字k不再c中,添加一个关键字为k的元素,对其进行值初始化 c.at(k) 访问关键字为k的元素,带参数检测,如果k不再c重那么返回一

【足迹C++primer】33、再探迭代器

再探迭代器 这里有插入迭代器,有流迭代器,反向迭代器,移动迭代器. 插入迭代器 这是一种迭代器适配器,接受一个容器,生成一个迭代器,实现向给定容器添加元素. 插入迭代器有三种类型,差异在于元素插入的位置 back_inserter创建一个使用push_back的迭代器. front_inserter创建一个使用push_front的迭代器. inserter创建一个使用insert的迭代器. void fun1() { list<int> lst={1,2,3,4}; list<int&

【足迹C++primer】39、动态内存与智能指针(2)

动态内存与智能指针(2) 直接管理内存 void fun1() { //此new表达式在自由空间构造一个int型对象,并返回指向该对象的指针 int *pi1=new int; //pi指向一个动态分配.未初始化的无名对象 string *ps3=new string; //初始化为空string int *pi2=new int; //pi指向一个未初始化的int int *pi3=new int(1024); //pi指向的对象的值为1024 string *ps4=new string(1

【足迹C++primer】56、文本查询程序

/** * 功能:文本查询程序 * 时间:2014年7月23日10:26:09 * 作者:cutter_point */ #include<iostream> #include<algorithm> #include<memory> #include<set> #include<map> #include<fstream> #include<sstream> using namespace std; /* Alice Em

【足迹C++primer】41、文本查询程序

/** * 功能:使用标准库:文本查询程序 * 时间:2014年7月10日09:10:15 * 作者:cutter_point */ #include<iostream> #include<map> #include<set> #include<fstream> #include<sstream> #include<string> #include<vector> #include<memory> using

【足迹C++primer】26、顺序容器操作

顺序容器操作 向顺序容器添加元素 forward_list //有自己专有版本的insert和emplace: forward_list //不支持push_back和emplace_back vector, string //不支持push_front和emplace_front c.push_back(t), c.emplace_back(args) //在c的尾部创建一个值为t的或者由args创建的元素,返回void c.push_front(t), c.emplace_back(args

【足迹C++primer】31、初识泛型算法

初识泛型算法 理解算法的最基本方法是了解他们是否读取元素.改变元素或是重排元素顺序! 只读算法 #include<iostream> #include<numeric> using namespace std; //对vec中的元素求和,初值是0 int sum=accumulate(vec.cbegin(), vec.cend(), 0); 这里面第三个参数决定了函数使用哪个加法运算符以及返回值类型. 算法和元素类型 string sum=accumulate(v.cbegin(