vector的reserve和resize

vector 的reserve增加了vector的capacity,但是它的size没有改变!而 resize 改变了vector的capacity 同时也增加了它的size!
原因如下:
      reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。 加入新的元素时,要调用push_back()/insert()函数。

      resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了, 因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。

      两个函数的参数形式也有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小, 第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:
例子1:
vector<int> myVec;
myVec.reserve( 100 );     // 新元素还没有构造, 
                                       // 此时不能用[]访问元素
for (int i = 0; i < 100; i++ )

     myVec.push_back( i ); //新元素这时才构造
}
myVec.resize( 102 );      // 用元素的默认构造函数构造了两个新的元素
myVec[100] = 1;           //直接操作新元素
myVec[101] = 2;  
例子2:
#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> vect;
    
    vect.push_back(1);
    vect.push_back(2);
    vect.push_back(3);
    vect.push_back(4);
    vect.reserve(100);
    cout<<vect.size()<<endl;  //size为4,但是capacity为100
    int i = 0;
    for (i = 0; i < 104; i++)
    {
        cout<<vect[i]<<endl;
    }
    return 0;
}
例子3:
#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> vect;    
    vect.push_back(1);
    vect.push_back(2);
    vect.push_back(3);
    vect.push_back(4);
    vect.resize(100);    //新的空间不覆盖原有四个元素占有的空间,现在size和capacity都是100
    cout<<vect.size()<<endl;
    int i = 0;
    for (i = 0; i < 104; i++)
    {
        cout<<vect[i]<<endl;  
    }
    return 0;
}
例子4:
#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> vect;        
    vect.resize(100);    //分配100个空间
    vect.push_back(1);
    vect.push_back(2);
    vect.push_back(3);
    vect.push_back(4);
    cout<<vect.size()<<endl; //现在size和capacity都是104
    int i = 0;
    for (i = 0; i < 104; i++)
    {
        cout<<vect[i]<<endl;  
    }
    return 0;
}
      从上面例子可以看出,不管是调用resize还是reserve,二者对容器原有的元素都没有影响。
对于一个数n,我们可以将其拆分成若干组数位相同的数字,然后读出每一组数字的数值和单位。例如: - 对于 123456789,我们可以将其拆分成 1 亿,2345 万,6789。 - 对于 200000,我们可以将其拆分成 2 十万。 具体的读法可以参考以下规则: - 对于 1~9 的数字,直接读出其汉字,如 1 读作“一”,9 读作“九”。 - 对于 10~99 的数字,读出十位数的汉字,如果个位数不为 0,则加上个位数的汉字,如 22 读作“二十二”,55 读作“五十五”。 - 对于 100~999 的数字,读出百位数的汉字,如果十位数为 0,则只读出“几百”,否则在“几百”后加上十位数和个位数的汉字,如 234 读作“二百三十四”,707 读作“七百零七”。 - 对于 1000~9999 的数字,读出千位数的汉字,如果百位数为 0,则只读出“几千”,否则在“几千”后加上百位数、十位数和个位数的汉字,如 5678 读作“五千六百七十八”。 - 对于 10000~99999 的数字,读出万位数的汉字,如果千位数为 0,则只读出“几万”,否则在“几万”后加上千位数、百位数、十位数和个位数的汉字,如 12345 读作“一万二千三百四十五”。 - 对于 100000~999999 的数字,读出十万位数的汉字,如果万位数为 0,则只读出“几十万”,否则在“几十万”后加上万位数、千位数、百位数、十位数和个位数的汉字,如 234567 读作“二十三万四千五百六十七”。 - 对于 1000000~99999999 的数字,读出百万位数的汉字,如果十万位数为 0,则只读出“几百万”,否则在“几百万”后加上十万位数、万位数、千位数、百位数、十位数和个位数的汉字,如 12345678 读作“一千二百三十四万五千六百七十八”。 - 对于 100000000~999999999 的数字,读出亿位数的汉字,如果百万位数为 0,则只读出“几亿”,否则在“几亿”后加上百万位数、十万位数、万位数、千位数、百位数、十位数和个位数的汉字,如 987654321 读作“九亿八千七百六十五万四千三百二十一”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值