STL学习笔记(九) 序列式容器 vector

 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 
	 */
	 
	
}





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值