zoukankan      html  css  js  c++  java
  • vector用法

    一:初始化问题:

    1. 定义一个已知长度的 vector :

    vector<int>ivec(10);//初始化为size=10,capacity为10,元素值全部为0(默认)
    int cap=ivec.capacity();
    int size=ivec.size();
    ivec.push_back(1);//成为第11个

    vector的元素被初始化为与其类型相关的缺省值:算术和指针类型的缺省值是 0,对于class 类型,缺省值可通过调用这类的缺省构造函数获得,我们还可以为每个元素提供一个显式的初始值来完成初始化

    2.显示初始化vector:

    vector< int > ivec( 10, -1 ); //定义了10个元素,每个元素初始化为-1;

    3.利用迭代器初始化:

    int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };

    我们不能用同样的方法显式地初始化 vector ,但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现,例如:   
    // 把 ia 的 6 个元素拷贝到 ivec 中  
    vector< int > ivec( ia, ia+6 );  

    总结:其实都是利用vector的构造函数进行初始化

     二:vector的resize()和reserve()问题:resize对应的是finish指针,而reserve对应的是end_storage指针

    当使用vector中的reserve时会重新分配内存空间,使capacity变大,reserve参数大于等于原来的size,如果小于原来的size的话就不用重新分配。

    而当使用resize,只要new size不大于capacity,则不会重新分配内存空间,如上图可以看到动态数组的地址是没有发生变化的。

    resize之后数组的长度变成了new size,如果new size比原来size大的话,新元素为未知值,没有初始化,如果new size比原来的小的话就截断,但内存空间也没有重新分配

    当resize的参数大于capacity,则会重新分配内存空间。

    三:at()和operator[]

    1、   vector::at()

    2、   vector::operator[]                    //不进行边界检查

    operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。

    四:尽量使用c.empty()代替c.size(),因为后者需要遍历整个vector得到个数,效率低

    五:vector的拷贝构造函数的,只拷贝到finish指针的元素。

    vector<int> nums;
     nums.push_back(1);

     nums.push_back(1);

     nums.push_back(2);

     nums.push_back(2);
     vector<int>().swap(nums); 

        vector<int>().swap(nums); 或者如下所示 加一对大括号都可以,意思一样的:  
        { 
         std::vector<int> tmp (nums);//拷贝构造函数是只拷贝到finish位置   
         nums.swap(tmp); 
        }      

  • 相关阅读:
    IDL读取TXT文件并写入二维数组中【转】
    远程连接ArcSDE
    Silverlight项目启动出现System.NullReferenceException未将对象引用到对象实例
    ENVI扩展工具:HDF5 Browser
    READF: End of file encountered. Unit: 100
    ENVI4.8下从两幅分类结果的栅格图中计算土地利用类型转换矩阵
    IDL中去掉数组中相同的元素方法
    利用IDL程序自动添加ENVI菜单【转】
    WIN7远程桌面连接知识
    对COM组件的调用返回了错误"HRESULT E_FAIL”的错误分析(c#与IDL混合编程)转
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4514848.html
Copyright © 2011-2022 走看看