C++STL通用容器----->vector

  • 定义

  • vector的头文件:#include<vector>
  • vector是动态数组,与数组不同的是元素个数会随着vector对象个数的增大/减小自动变化(与string相似)
  • 包含函数

单口

  • 实现动态增长

  • 步骤(1.申请新地址[*2] 2.拷贝 3.释放 4.插入)
  • 当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请空间。
#include<iostream>


//vector容器
using namespace std;
template<typename T>
class DArray
{
	T* pdata;
	int length;
	int size;
public:
	DArray(int s)
	{
		size = s;
		length = 0;
		pdata = new T[size];
	}


	void add(T value)
	{
		if (length < size)
		{
			pdata[length] = value;
			length++;
		}

		else//空间不足时
		{
			size = size * 2;
			T* temp = new T[size];//申请空间*2
			for (int i = 0; i < length; i++)//拷贝
			{
				temp[i] = pdata[i];
			}
			delete[]pdata;//把指针指向的空间释放掉,但pdata还在
			pdata = temp;//temp给pdata,else结束temp释放

			pdata[length] = value;
			length++;
		}

	}
	void show() {
		for (int i = 0; i < length; i++)
			cout << pdata[i] << " ";
	}
	~DArray() { if (pdata) { delete[]pdata; pdata = NULL; } }
//有new就有delete
};





int main()
{
	DArray<int> ary(3);
	ary.add(10); ary.add(20); ary.add(30);
	ary.add(40); ary.add(50); ary.add(60);
	ary.show();
	return 0;

}
  1. vector的遍历

  • vector是顺序表结构,所以遍历类似于顺序表,地址可++

vector<int>::iterator//类中的迭代器
        i = v.begin();
    for (; i != v.end(); i++)
        cout << *i << " ";)

//最基本的容器遍历语句

  • vector:动态数组/单口容器、顺序存储(顺序表)、随机访问迭代器
  • vector分为正向迭代器(begin,end)和反向迭代器(rbegin,rend)

代码如下:

void disp1(vector<int> v)//遍历
{
	vector<int>::iterator//类中的迭代器
		i = v.begin();
	for (; i != v.end(); i++)
		cout << *i << " ";
	//最基本的容器遍历语句

	cout << endl;
}
//反向迭代器
void disp2(vector<int> v)
{
	vector<int>::reverse_iterator//类中的迭代器
		i = v.rbegin();
	for (; i != v.rend(); i++)//++重载了
		cout << *i << " ";
	//最基本的容器遍历语句

	cout << endl;
}
  1. vector的初始化

  • 三种初始化方法:
  • vector<int> v2(2);该语句中2代表空间大小等于元素个数=2,元素初始为默认值(0,0)
  • vector<int> v3(3, 10);该语句中3代表空间大小等于元素个数=3,元素初始为10(10 10 10)
  • 顺序存储整体初始化
        int a[] = { 10,20,30 };
        vector<int> v4(a, a + sizeof(a)/sizeof(int));//整体数组(10 20 30)
        vector<int> v5(v4.begin(), v4.begin() + 2);//代表左闭右开的区间(10 20)
//创建初始化
void test2() 
{
	vector<int> v1;
	vector<int> v2(2);//2表示空间大小等于元素个数=2(0,0)
	disp1(v2);
	vector<int> v3(3, 10);//10 10 10

	//顺序存储整体初始化
	int a[] = { 10,20,30 };
	vector<int> v4(a, a + sizeof(a)/sizeof(int));
	vector<int> v5(v4.begin(), v4.begin() + 2);//10 20
	//迭代器左闭右开(first last)
	disp2(v5);
}
  1. vector的大小属性

  • v.size()表元素个数
  • v.capacity()表空间大小
  • v.max_size()表系统大小
  • v.resize(8);扩容空间为8且自动填充元素
  • v.reserve(15);扩容空间为15,不自动填充元素
//大小属性
void test3()
{
	vector<int> v(2);//0,0
	v.push_back(6);//0 0 6
//表元素个数
	cout << v.size() << endl;//2     //3
//空间大小
	cout << v.capacity() << endl;//2   满了   //4

//系统大小
	cout << v.max_size() << endl;

//resize-----扩容填充
	v.resize(8);//不够补默认值,一般为0
	//v.resize(8,5)不够补5
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	disp1(v);


//reserve-----扩容
	v.reserve(15);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	disp1(v);

}
  1. vector存取数据

  • v.push_back()存数据
  • 取数据可用数组方法直接取,例如cout << v[1] << endl;
  • cout << v.front();//取头
  • cout << v.back();//取尾
//存取数据
void test4() 
{
	//存数据
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	//取数据
	cout << v[1] << endl;
	cout << v.at(1) << endl;//检测越界

	cout << v.front();//取头
	cout << v.back();//取尾

	cout << *(v.begin() + 2);//+重载     因为是顺序存储,所以地址可加
}
  1. vector插入删除

  • 插入v.insert(位置,插入数据)
  • 插入v.insert(位置,插入个数,插入数据)
  • 插入v.insert(w.begin(), v.begin(), v.end())//把v的一段插入到w的特定位置
  • w.pop_back();//删尾
  • w.erase(w.end() - 1);//删一个位置
  • w.erase(w.begin(), w.begin() + 2);//删一段
//插入删除
void test5()
{
	int a[] = { 10,20,30 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	//插入
	v.insert(v.begin() + 1, 15);
	v.insert(v.begin() + 1, 4, 25);//插入了4个25

	vector<int> w;
	w.insert(w.begin(), v.begin(), v.end());//把v的一段插入到w的特定位置
	disp1(w);//10 25 25 25 25 15 20 30
//删除
	w.pop_back();//删尾
	w.pop_back();//10 25 25 25 25 15

	w.erase(w.end() - 1);//10 25 25 25 25
	//删一个位置
	w.erase(w.begin(), w.begin() + 2);//25 25 25
	//删一段
	disp1(w);
}
  • 用vector建立小型学生信息管理系统

  1. 定义一个学生类
class stu {
	string sno;
	string name;
	int score;
public:
	stu(string no, string n, int s)
	{
		sno = no; name = n; score = s;
	}
	void show() {
		cout << sno << " " << name << " " << score << endl;
	}
	string getsno() { return sno; }
	void setscore(int s) { score = s; }
};
  1. 定义一个管理类实现增删改查
class Manage
{
	vector<stu> v;//容器中放符合类型
public:
	//增删改查遍历
	//增加
	void add(stu s)
	{
		v.push_back(s);

	}
	//查找
	vector<stu>::iterator chaxun(string no)
	{
		vector<stu>::iterator//类中的迭代器
			i = v.begin();
		for (; i != v.end(); i++)
		{
			if ((*i).getsno() == no)
			{
				(*i).show(); break;
			}
			
		}
		return i;
	}
	//删除
	void shanchu(string no)
	{
		vector<stu>::iterator    i=chaxun(no);
		if (i != v.end()) v.erase(i);
	}

	//遍历
	void disp()
	{
		vector<stu>::iterator//类中的迭代器
			i = v.begin();
		for (; i != v.end(); i++)
			(*i).show();//用stu.show()
		//不是基本数据对象不能直接
		//i->show();
		//最基本的容器遍历语句

		cout << endl;
	}
	//修改
	void xiugai(string no)
	{
		vector<stu>::iterator//类中的迭代器
			i = v.begin();
		for (; i != v.end(); i++)
			if (i != v.end()) (*i).setscore(100);
	}
};

测试代码如下:

void test1()
{
	stu s1("1001", "zhang", 65),
		s2("1002", "wang", 75),
		s3("1003", "lang", 85);
	Manage m;
	m.add(s1); m.add(s2); m.add(s3);
	m.disp();
	cout << "查询结果是" << endl;
	m.chaxun("1002");

	cout << "删除结果是" << endl;
	m.shanchu("1002");
	m.disp();
	cout << "修改结果是" << endl;
	m.xiugai("1003");
	m.disp();
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狒狒998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值