STL(标准模板库)—Vector

目录

Vector

1、创建一个名为V的vector容器 整型数组

2、vector容器中存放自定义的数据类型

3、vector容器嵌套容器

Vector遍历打印函数

vector容器_构造函数

1、默认构造 无参构造

2、通过区间方式进行构造

3、n个elem方式构造

4、拷贝构造

 vector赋值操作

1、创建V1 并赋值

2、赋值 operator=

3、assign 

4、n个elem 方式赋值

 vector容量和大小

1、创建V1 并赋值 

2、empty判断是否为空

3、capacity计算容量

4、size计算大小

5、resize重新指定大小

vector的插入和删除

1、创建V1

2、尾插

3、尾删

4、插入

5、删除

6、清空

 vector数据存储

1、利用[]方式访问数组中的元素

2、利用at方式访问元素

3、获取第一个元素

4、获取最后一个元素

 vector容器_互换容器

1、具体用法

2、实际用途

 vector预留空间

1、利用reserve预留空间

2、利用reserve预留空间的好处

案例—评委打分

1、案例描述:

2、实现步骤:

案例—员工分组

1、案例描述:

2、实现步骤



 

Vector

STL中最常用的容器Vector 可以理解为数组 
Vector存放内置数据类型
//容器:vector 
//算法:for_each
//迭代器:vector<int>::iterator

1、创建一个名为V的vector容器 整型数组

a、插入数据

//创建一个名为V的vector容器 整型数组
	vector<int> V;

	//向容器中插入数据
	V.push_back(10);
	V.push_back(20);
	V.push_back(30);
	V.push_back(40);

 b、遍历数据

第一种遍历方式:通过迭代器访问容器中的数据

vector<int>::iterator itBegin = V.begin();//起始迭代器  指向容器中第一个元素

vector<int>::iterator itEnd = V.end();//结束迭代器 指向容器中最后一个元素的下一个位置

while (itBegin != itEnd)
	{
		cout << *itBegin << endl;
		itBegin++;
	}

第二种遍历方式:for循环法

for (vector<int>::iterator itB = V.begin(); itB != V.end(); itB++)
	{
		cout << *itB << endl;
	}

 第三种遍历方式:for_each

首先自定义打印函数:

void MyPrint1(int val)
{
	cout << val << endl;
}

接着:

for_each(V.begin(), V.end(), MyPrint1); 

 注意添加:#include<algorithm>//标准算法头文件

2、vector容器中存放自定义的数据类型

首先创建一个Person类:

class Person
{
public:
	Person(string name, int age)
	{
		this->m_age = age;
		this->m_name = name;
	}

	string m_name;
	int m_age;
};

A、创建一个名为P的vector容器 Person型数组

a、插入数据


void test02()
{
	//创建一个名为P的vector容器 Person型数组
	vector<Person> P;

	Person P1("aaa", 23);
	Person P2("bbb", 25);
	Person P3("ccc", 24);
	Person P4("ddd", 22);
	Person P5("eee", 21);

	//向容器中插入数据
	P.push_back(P1);
	P.push_back(P2);
	P.push_back(P3);
	P.push_back(P4);
	P.push_back(P5);

	

b、遍历容器中的数据

 第一种遍历方式:通过迭代器访问容器中的数据

vector<Person>::iterator itBegin = P.begin();//起始迭代器  指向容器中第一个元素

vector<Person>::iterator itEnd = P.end();//结束迭代器 指向容器中最后一个元素的下一个位置

while (itBegin != itEnd)
	{
		cout << " 姓名: " << itBegin->m_age << endl;
		cout <<  " 年龄: " <<itBegin->m_name << endl;
		itBegin++;
	}

第二种遍历方式:for循环

for (vector<Person>::iterator itB = P.begin(); itB != P.end(); itB++)
	{
		cout << " 姓名: " << itB->m_age << endl;
		cout << " 年龄: " << itB->m_name << endl;
	}

 第三种遍历方式:for_each

首先自定义打印函数:

void MyPrint2(Person P)
{
	cout << " 姓名: " << P.m_name<< endl;
	cout << " 年龄: " << P.m_age<< endl;
}

接着:

for_each(P.begin(), P.end(), MyPrint2); 

注意包含头文件:#include<algorithm>//标准算法头文件 

B、创建一个名为P的vector容器 Person*型数组

a、插入数据: 

vector<Person*> P;

Person P1("aaa", 23);
Person P2("bbb", 25);
Person P3("ccc", 24);
Person P4("ddd", 22);
Person P5("eee", 21);

//向容器中插入数据
P.push_back(&P1);
P.push_back(&P2);
P.push_back(&P3);
P.push_back(&P4);
P.push_back(&P5);

b、遍历容器中的数据

 第一种遍历方式:通过迭代器访问容器中的数据

vector<Person*>::iterator itBegin = P.begin();//起始迭代器  指向容器中第一个元素

vector<Person*>::iterator itEnd = P.end();//结束迭代器 指向容器中最后一个元素的下一个位置

while (itBegin != itEnd)
	{
		cout << " 姓名: " << (*itBegin)->m_age << endl;
		cout << " 年龄: " << (*itBegin)->m_name << endl;
		itBegin++;
	}

第二种遍历方式:for循环

for (vector<Person*>::iterator itB = P.begin(); itB != P.end(); itB++)
	{
		cout << " 姓名: " << (*itB)->m_age << endl;
		cout << " 年龄: " << (*itB)->m_name << endl;
	}

 第三种遍历方式:for_each

首先自定义打印函数:

void MyPrint3(Person* P)
{
	cout << " 姓名: " << P->m_name << endl;
	cout << " 年龄: " << P->m_age << endl;
}

接着:

for_each(P.begin(), P.end(), MyPrint3);  

注意包含头文件:#include<algorithm>//标准算法头文件 

3、vector容器嵌套容器

a、首先创建5个小容器 并添加数据

	vector<vector<int>> V;

	//创建小容器
	vector<int>V1;
	vector<int>V2;
	vector<int>V3;
	vector<int>V4;
	vector<int>V5;

	//向小容器中添加数据
	for (int i = 0; i < 5; i++)
	{
		V1.push_back(i + 1);
		V2.push_back(i + 2);
		V3.push_back(i + 3);
		V4.push_back(i + 4);
		V5.push_back(i + 5);
	}

b、将小容器添加到大容器中

	V.push_back(V1);
	V.push_back(V2);
	V.push_back(V3);
	V.push_back(V4);
	V.push_back(V5);

c、通过大容器 将所有数据遍历一遍

for (vector<vector<int>>::iterator itB = V.begin(); itB != V.end(); itB++)
	{
		for (vector<int>::iterator itb = (*itB).begin(); itb != (*itB).end(); itb++)
		{
			cout << *itb << " " << endl;
		}
	}

Vector遍历打印函数

void PrintVector(vector<int>& V)
{
	for (vector<int>::iterator it = V.begin(); it != V.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

vector容器_构造函数

1、默认构造 无参构造

vector<int> V1;

2、通过区间方式进行构造

vector<int>V2(V1.begin(), V1.end());

3、n个elem方式构造

vector<int>V3(10, 10);

4、拷贝构造

vector<int>V4(V3);

结果:

 vector赋值操作

1、创建V1 并赋值

vector<int>V1;
	for (int i = 0; i < 10; i++)
	{
		V1.push_back(i);
	}

2、赋值 operator=

vector<int> V2;
	V2 = V1

3、assign 

vector<int> V3;
	V3.assign(V1.begin(), V1.end());

4、n个elem 方式赋值

vector<int> V4;
	V4.assign(10, 100);

结果:

 vector容量和大小

1、创建V1 并赋值 

vector<int>V1;
	for (int i = 0; i < 10; i++)
	{
		V1.push_back(i);
	}

2、empty判断是否为空

if (V1.empty())

判断是否为空 返回值为真则为空

3、capacity计算容量

V1.capacity()

4、size计算大小

V1.size()

5、resize重新指定大小

V1.resize(15, 10);

利用重载的版本 可以利用参数2指定默认填充值

V1.resize(5);

重新指定大小 若指定的大小更小 超出的元素会被删除

结果:

vector的插入和删除

1、创建V1

vector<int>V1;

2、尾插

V1.push_back(10);
V1.push_back(20);
V1.push_back(30);
V1.push_back(40);
V1.push_back(50);

3、尾删

V1.pop_back();

4、插入

V1.insert(V1.begin(), 2, 100);

在V1的开头插入2个100

5、删除

V1.erase(V1.begin());

6、清空

V1.erase(V1.begin(), V1.end());

等同于V1.clear()

结果:

 vector数据存储

1、利用[]方式访问数组中的元素

for (int i = 0; i < V1.size(); i++)
	{
		cout << V1[i] << " ";
	}

2、利用at方式访问元素

for (int i = 0; i < V1.size(); i++)
	{
		cout << V1.at(i) << " ";
	}

3、获取第一个元素

 V1.front()

4、获取最后一个元素

V1.back()

结果:

 vector容器_互换容器

1、具体用法

V1.swap(V2);

结果:

 

2、实际用途

vector<int>(V1).swap(V1);

巧用swap收缩内存

结果: 

 vector预留空间

1、利用reserve预留空间

V1.reserve(10000);

2、利用reserve预留空间的好处

 利用reserve预留空间之后

案例—评委打分

1、案例描述:

有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中的最低分,取平均分。

2、实现步骤:

a、创建五名选手,放在vector中

首先要创建选手类

class Person
{
public:
	Person(string name, int score)
	{
		m_name = name;
		m_score = score;

	}

	string m_name;
	int m_score;
};

接着创建选手

void CreatePerson(vector<Person>&v)
{
	string nameSeed = "ABCDE";
	for (int i = 0; i < 5; i++)
	{
		string name = "选手";
		name += nameSeed[i];

		int score = 0;

		Person P(name, score);

		//将创建的Person对象 放入到容器中
		v.push_back(P);

	}
}

b、遍历vector容器,取出来每一位选手,执行for循环,可以把10个评分都存放在deque容器中

for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		//将选手的打分放在deque容器中
		deque<int>d;
		for (int i = 0; i < 10; i++)
		{
			//随机数分数输入
			int score = rand() % 41 + 60;//产生60到100之间的随机数
			d.push_back(score);
		}
}

 c、sort算法对deque容器中分数排序,去除最高和最低分

//排序
sort(d.begin(), d.end());

//去除最高分去除最低分
d.pop_back();
d.pop_front();

d、获取平均分

int sum = 0;
for (deque<int>::iterator itb = d.begin(); itb != d.end(); itb++)
{
	sum += *itb;
}

int avg = sum / d.size();

e、展示最后分数

void ShowScore(vector<Person>&v)
{
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << (*it).m_name << " 分数:" << (*it).m_score << endl;
	}
}

案例—员工分组

1、案例描述:

1.1公司招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,需要指派员工在那个部门工作

1.2员工信息有:姓名 工资组成;部门分为:策划、美术、研发

1.3随机给10名员工分配部门和工资

1.4通过multimap进行信息的插入key(部门编号)value(员工)

1.5分部门显示员工信息

2、实现步骤

2.1创建10名员工,放在vector容器中

void CreatePerson(vector<Person>&P)
{
	string NameSeed = "ABCDEFGHIG";
	for (int i = 0; i < 10; i++)
	{
		Person PP;
		PP.m_name = "员工";
		PP.m_name += NameSeed[i];

		PP.m_salary = rand() % 10000 + 10000;

		//将员工放在容器中
		P.push_back(PP);
	}

}

2.2遍历vector容器,取出每个员工,进行随机分组

void SetGroup(vector<Person>&P, multimap<int, Person>&mPerson)
{
	for (vector<Person>::iterator it = P.begin(); it != P.end(); it++)
	{
		int deptId = rand() % 3 + 1;
		
	}
}

2.3分组后,将员工部门编号作为key,具体员工工作为value,放入到multimap容器中

//将员工插入到分组中
//key作为部门编号 value作为具体员工
mPerson.insert(make_pair(deptId, *it));

2.4分部门显示员工信息

void ShowPerson(multimap<int, Person>&mP)
{
	cout << "策划部门:" << endl;
	multimap<int, Person>::iterator pos1 = mP.find(CEHUA);
	int count1 = mP.count(CEHUA);
	int index1 = 0;
	for (; pos1 != mP.end() && index1 < count1; pos1++, index1++)
	{
		cout << "编号:" << pos1->first << " 姓名:" << pos1->second.m_name << " 薪水:" << pos1->second.m_salary << endl;
	}

	cout << "-------------------------------" << endl;

	cout << "美术部门:" << endl;
    pos1 = mP.find(CEHUA);
	count1 = mP.count(CEHUA);
	index1 = 0;
	for (; pos1 != mP.end() && index1 < count1; pos1++, index1++)
	{
		cout << "编号:" << pos1->first << " 姓名:" << pos1->second.m_name << " 薪水:" << pos1->second.m_salary << endl;
	}

	cout << "-------------------------------" << endl;

	cout << "研发部门:" << endl;
	pos1 = mP.find(CEHUA);
	count1 = mP.count(CEHUA);
	index1 = 0;
	for (; pos1 != mP.end() && index1 < count1; pos1++, index1++)
	{
		cout << "编号:" << pos1->first << " 姓名:" << pos1->second.m_name << " 薪水:" << pos1->second.m_salary << endl;
	}

}

//随机数种子
srand((unsigned int)time(NULL));

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学代码的小呆鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值