博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转:vector的reserve和resize
阅读量:7170 次
发布时间:2019-06-29

本文共 2060 字,大约阅读时间需要 6 分钟。

      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,二者对容器原有的元素都没有影响。

 

 

UploadFileItem*  pUpload = new  UploadFileItem;

strcpy(pUpload->IP, pOldData->txtData._IP);

strcpy( pUpload->srcFile,msg->localFile);

pUpload->vecFiles.reserve(10); //如果不加这一句,内存可能要越界,因为vector是连续内存。

注意为容器指定合适的大小可以加快速度。否则可能很快就要重新分配内存。

m_pImgTran->GetTranFiles(pUpload->vecFiles);

m_pXmlTran->GetTranFiles(pUpload->vecFiles);

 

转载地址:http://odqwm.baihongyu.com/

你可能感兴趣的文章
spring mvc 程序
查看>>
mysqlbinlog -v CHANGE MASTER TO
查看>>
Jmeter===Jmeter中使用CSV Data Set Config参数化不重复数据执行N遍(转)
查看>>
thrift-TFileTransport
查看>>
【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
查看>>
FreeRTOS 移植到WIN10
查看>>
Manacher算法笔记 C++
查看>>
不同的国家/地区与语言缩写代码
查看>>
NS2网络模拟(6)-homework02.tcl
查看>>
内核基本的体系结构
查看>>
面向对象
查看>>
工作流
查看>>
PHP算法学习(8) 环形链表 解决约瑟夫问题
查看>>
winform dategridview 自动完成。
查看>>
com.domain.bean
查看>>
Python 实现整数线性规划:分枝定界法(Branch and Bound)
查看>>
ajax,cookie和localStoragede 的基础知识
查看>>
python 进程间通信
查看>>
Vulkan:初始化 前篇
查看>>
SharePoint2007站点中用户信息与AD用户信息的“不一致”问题
查看>>