zoukankan      html  css  js  c++  java
  • 元素空间STL学习笔记(九) 序列式容器 vector

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        

     vector 的个性:

        vector 除了可以应用标准容器共性序列式容器共性外  还可以应用如下函数:

        当前容量  .capacity(),用于事后分配数组空间,以免多次重新分配空间和复制   // 共性中的.size()表示元素个数

        约定容量  .reserve(n)

        (1)下标  .operator[ ]( i )  不检查越界   (2) .at( i )  会先检查越界,越界抛出异常

        (注意:不支持前插,插入仅能应用push_back 和 insert)

        

        

    vector 例子

        


        每日一道理
    青春是用意志的血滴和拼搏的汗水酿成的琼浆——历久弥香;青春是用不凋的希望和不灭的向往编织的彩虹——绚丽辉煌;青春是用永恒的执著和顽强的韧劲筑起的一道铜墙铁壁——固若金汤。
    #include <iostream>
    using namespace std;
    #include <vector>
    #include "show.h"
    
    #include <typeinfo>
    #include <exception>
    
    template <typename T>
    void print(const vector<vector<T> > &v) //打印二维数组
    {
    	
    	cout << "--------print-------------" << endl;
    	for(int i=0; i <v.size(); i++)
    	{
    		for(int j=0; j < v.at(i).size(); j++)
    		{
    			cout << v.at(i).at(j)  << ' ';
    		}
    		cout << endl;
    	}
    	cout << "------------------------" << endl;
    }
    
    int main()
    {
    		vector<double> vd,vv,vi;
    		cout <<  vd.size()  <<  '/' << vd.capacity() << endl;
    		cout << "----------------------" << endl;
    		for(int i = 0; i< 9; i++)
    		{
    			vd.push_back(i+0.1);
    			cout <<  vd.size()  <<  '/' << vd.capacity() << endl;
    		}
    	
    					/*
    					结果表现:
    					0/0
    					----------------------
    					1/1
    					2/2
    					3/4
    					4/4
    					5/8
    					6/8
    					7/8
    					8/8
    					9/16
    					*/
    					
    		vv.reserve(9); //如果有大量数据要插入,可以先把空间预留好,以免反复分配空间和复制数据
    		cout <<  vv.size()  <<  '/' << vv.capacity() << endl;
    		cout << "----------------------" << endl;
    		for(int i = 0; i< 10; i++)
    		{
    			vv.push_back(i+0.1);
    			cout <<  vv.size()  <<  '/' << vv.capacity() << endl;
    		}
    	
    				/*
    					0/9
    					----------------------
    					1/9
    					2/9
    					3/9
    					4/9
    					5/9
    					6/9
    					7/9
    					8/9
    					9/9
    					10/18
    				*/
    				
    				
    	/*vector迭代器重新分配内存后 ,迭代器会失效
    	 所以插入和删除数据后,迭代器要重新去取得*/
    		cout << "----------------------" << endl;
    		for(int i = 0; i< 10; i++)
    		{
    			vi.push_back(i+0.1);
    			cout << &*vi.begin() << ": " ;
    			cout <<  vi.size()  <<  '/' << vi.capacity() << endl;
    		}
    		
    		/*
    		 * 你会发明重新分配内存后 开始位置会变化
    				0x8886008: 1/1
    				0x8886018: 2/2
    				0x8886030: 3/4
    				0x8886030: 4/4
    				0x8886058: 5/8
    				0x8886058: 6/8
    				0x8886058: 7/8
    				0x8886058: 8/8
    				0x8886210: 9/16
    				0x8886210: 10/16
    		*/
    		
    		
    		/*拜访元素的值*/
    		
    		//不做越界检查的 [ ]
    		for(int i=0; i< vi.size(); i++)
    		{
    			cout << vi[i] << ' ';
    		}
    		cout << endl;
    		
    		//做越界检查的拜访 at  越界抛出std::out_of_range
    		try
    		{
    			for(int i=0; i<= vi.size(); i++)
    			{
    				cout << vi.at(i) << ' ';
    			}
    			cout << endl;
    		}
    		catch(exception &e)
    		{
    			cout << "异常:" << e.what()  << endl; //vector::_M_range_check
    			cout << "类型:" << typeid(e).name() << endl;// St12out_of_range
    		}
    	
    	 //修改数据
    	 vi[1] = 123.45;
    	 vi.at(2) = 67.8;
    	 show(vi.begin(), vi.end()); //0.1 123.45 67.8 3.1 4.1 5.1 6.1 7.1 8.1 9.1 
    	 
    	 
    	 //序列式容器特有的构造函数 
    	 vector<int> vtest(3,4); //3个4
    	 cout << vtest.size() << '/' << vtest.capacity()  << endl;	// 3/3
    	 show(vtest.begin(), vtest.end());// 4 4 4
    	 
    	  vector<int> vtest2(3); //3个0
    	 cout << vtest2.size() << '/' << vtest2.capacity()  << endl;	// 3/3
    	 show(vtest2.begin(), vtest2.end());// 0 0 0
    	 
    	 
    	 /*二位数组*/
    	 int m=3,n=5;
    	  // 空格离隔尖括号 否则报错 error: ‘>>’ should be ‘> >’ within a nested template argument list
    	 vector<vector<int> > vvi(m,vector<int>(n)); //m个vector元素,每一个vector含5个0 
    	 print(vvi);
    	/*
    	 0 0 0 0 0 
    	0 0 0 0 0 
    	0 0 0 0 0 
    	 */
    	
    	
    	vvi.resize(m+3);//修改元素个数为6个 ,新增的元素是空构造函数
    	vvi[1].assign(9,1);//将第二个元素设置为9个1
    	vvi[5].assign(11,1);//将第六个元素设置为11个1
    	//cout << "-----------" << endl;
    /*
    	for(int i=0;i <m+3;i++)
    	{
    		show(vvi[i].begin(),vvi[i].end());
    	}
    */
    	print(vvi);
    	 /*
    	 0 0 0 0 0 
    	1 1 1 1 1 1 1 1 1 
    	0 0 0 0 0 
    	
    	
    	1 1 1 1 1 1 1 1 1 1 
    	 */
    	 
    	
    }



        


        


    文章结束给大家分享下程序员的一些笑话语录: 程序员的愿望
      有一天一个程序员见到了上帝.上帝: 小伙子,我可以满足你一个愿望.程序员: 我希望中国国家队能再次打进世界杯.
      上帝: 这个啊!这个不好办啊,你还说下一个吧!
      程序员: 那好!我的下一个愿望是每天都能休息6个小时以上.
      上帝: 还是让中国国家打进世界杯.

  • 相关阅读:
    训练计划
    LA_3942 LA_4670 从字典树到AC自动机
    HDU 6180 Schedule
    HDU 6153 KMP
    HDU 2087 HDU 1867 KMP标准模板题
    Struts2学习8--文件上传(单个文件上传)
    SSH错误之--Error getting property descriptor: null at com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor.getProperty
    Struts2学习7---集合类型的类型转换
    工具-windows命令--查看端口占用情况,关闭端口
    Struts2学习6—OGNL (1)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3091406.html
Copyright © 2011-2022 走看看