• [STL]vector


          与普通数组array不同,vector是动态空间,它支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。随着元素的加入,它会自行扩充空间来容纳新元素,这些特性都是vector实现技术的关键所在。

    一.vector成员函数:

          首先了解vector的各个成员函数的作用:

    1.访问元素的方法

    • vec[i] - 访问索引值为 i 的元素引用。
    • vec.at(i) - 访问索引值为 i 的元素的引用,以 at() 访问会做数组边界检查,如果访问越界将会抛出异常
    • vec.front() - 回传 vector 第一个元素的引用。
    • vec.back() - 回传 vector 最尾元素的引用。

    2.新增或移除元素的方法

    • vec.push_back() - 新增元素至 vector 的尾端,必要时会进行存储器配置。
    • vec.pop_back() - 删除 vector 最尾端的元素。
    • vec.insert() - 插入一个或多个元素至 vector 内的任意位置。
    • vec.erase() - 删除 vector 中一个或多个元素。
    • vec.clear() - 清空所有元素。

    3.取得长度/容量

    • vec.size() - 取得 vector 目前持有的元素个数。
    • vec.empty() - 如果 vector 内部为空,则传回 true 值。
    • vec.capacity() - 取得 vector 目前可容纳的最大元素个数。通常只会增加,不会因为元素被删减而随之减少。

    4.重新配置/重设长度

    • vec.reserve() - 如有必要,可改变 vector 的容量大小。
    • vec.resize() - 改变 vector 目前持有的元素个数。

    5.迭代器

    • vec.begin() - 回传一个Iterator,它指向 vector 第一个元素。
    • vec.end() - 回传一个Iterator,它指向 vector 最尾端元素的下一个位置(请注意:它不是最末元素)。
    • vec.rbegin() - 回传一个反向Iterator,它指向 vector 最尾端元素的。
    • vec.rend() - 回传一个Iterator,它指向 vector 的第一个元素。

     

    二.vector内存配置

          vector实现关键在于在于其对大小的控制以及重新配置是的数据移动效率

          vector采用线性连续空间。为了降低控制配置时的速度成本,vector实际配置的大小可能比客户端的需求量更大一些,用来满足后续需要,这就是capacity的观念。动态增加大小并不是在原空间之后增加新空间,而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后原内容之后构造新元素,并释放原空间。所以一旦vector空间重新配置,指向vector的迭代器全部失效

          通过一个测试程序来重点理解vector的size()、resize()和reserve()三个函数:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void Print(vector<int> &ans)
    {
    	cout<<"ans的成员是:";
    	for(vector<int>::iterator iter=ans.begin();iter!=ans.end();iter++)
    		cout<<*iter<<" ";
    	cout<<endl<<"ans的size是:"<<ans.size()<<endl;
    	cout<<"ans的capacity是:"<<ans.capacity()<<endl<<endl;
    }
    int main()
    {
    	int a[5]={1,2,3,4,5};
    	vector<int> ans(a,a+5); //定义一个vector并初始化
    	Print(ans);
    	ans.push_back(6); //新增一个元素6
    	Print(ans);
    	ans.resize(3); //将ans中元素减少到3个
    	Print(ans);
    	ans.resize(10,7); //将ans中元素增加到10个,未定义的初始化为7
    	Print(ans);
    	ans.reserve(20); //增加ans的容量到20
    	Print(ans);
    	ans.~vector(); //析构释放内存
    	Print(ans);
    	return 0;
    }
    

         结果如下:

          一般来说vector的所占内存只能增大不会减小,生命结束时会在自动调用析构函数释放内存。当然了,我们可以利用一个小技巧释放内存,如下:

    vector<int> num1;
    vector<int> num2(10);
    cout<<num2.capacity()<<endl;
    num2.swap(num1);
    cout<<num2.capacity()<<endl;
    

      

    参考:

    1.维基百科:http://zh.wikipedia.org/wiki/Vector_(STL)(它的实验好像不对 = =!)

    2.《STL源码剖析》

    3.vector内存释放机制  

  • 相关阅读:
    TortoiseSVN和VisualSVN-下载地址
    asp.net mvc输出自定义404等错误页面,非302跳转
    IIS7如何显示详细错误信息
    关于IIS7.5下的web.config 404 配置的一些问题
    MVC 错误处理1
    后台获取视图对应的字符串
    HTML5 ArrayBuffer:类型化数组 (二)
    Web 前沿——HTML5 Form Data 对象的使用(转)
    HTML5 File 对象
    HTML5 本地裁剪图片并上传至服务器(转)
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3511355.html
Copyright © 2020-2023  润新知