元素空间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个小时以上.
  上帝: 还是让中国国家打进世界杯.

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/21/3091406.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值