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));
STL(标准模板库)—Vector相关推荐
- 补8-5日复习内容 STL 标准模板库的容器
//有关 STL 标准模板库的函数 /* string 的 */ /* #include <iostream> #include <string> #include <w ...
- STL 标准模板库—容器部分【C++】
STL标准模板库 包含内容: 容器类:vector.list.deque.set.map等 迭代器:"泛型指针",每个容器都有自己的迭代器,[vector和deque的迭代器是随机 ...
- 19.3 C++STL标准模板库大局观-容器的说明和简单应用例续
19.1 C++STL标准模板库大局观-STL总述.发展史.组成与数据结构谈 19.2 C++STL标准模板库大局观-容器分类与array.vector容器精解 19.3 C++STL标准模板库大局观 ...
- 信息学奥赛中的STL(标准模板库)--2022.09.30
1.信息学奥赛一本通 第5版 第8章 C++实用技巧与模版库(6节) 第一节 排序算法 第二节 运算符重载 第三节 字符串(string) 第四节 FIFO队列和优先队列 第五节 动态数组 第六 ...
- 19.1 C++STL标准模板库大局观-STL总述、发展史、组成与数据结构谈
19.1 C++STL标准模板库大局观-STL总述.发展史.组成与数据结构谈 19.2 C++STL标准模板库大局观-容器分类与array.vector容器精解 19.3 C++STL标准模板库大局观 ...
- C++ STL 标准模板库介绍与入门
目录 1.概述 1.1.C++ 标准库 1.2.Boost库 2.STL 版本 2.1.HP 原始版本 2.2.P. J. 实现版本 2.3.RW 实现版本 2.4.SGI 实现版本 2.5.STLp ...
- 【跟学C++】C++STL标准模板库——算法详细整理(下)(Study18)
文章目录 1.简介 2.STL算法分类及常用函数 2.2.变序算法(二) 2.2.1 替换算法(2个) 2.2.2 排序算法(6个) 2.2.3 分区算法(4个) 2.2.4 可用于排序容器的算法(3 ...
- C++入门到精通 ——第七章 STL标准模板库大局观
七.STL标准模板库大局观 Author: XFFer_ 先分享一本 <C++ 标准库 第二版> ,望在STL的道路上从入门到放弃!(开玩笑的啦,愈行愈远~) 链接: https://pa ...
- C++提高编程----STL标准模板库-常用容器
STL标准模板库(Standard Template Library)-常用容器 C++的,面向对象和泛型编程,目的就是提高代码的复用性:为了建立数据结构和算法的统一标准,诞生了STL 一.STL初识 ...
最新文章
- DotNetNuke(DNN)网站发布、部署、迁移和重建
- 如何用Fiddler对手机(安卓/iOS)数据进行抓包
- 网页编程技术二(块级元素和行内标签)
- Scala里Unit 与 () Unit的区别
- python数据库连接池neo4j_在python中操作neo4j数据库的方法
- 《史蒂夫·乔布斯传》(Steve Jobs)官方正式中文版高清PDF
- 网络规划设计师水平考试备考资料(11.分析总结)
- m05_Extract Feature_Transformers(慎variances_)_download Adult互联网ads数据集_null value(?_csv_SVD_PCA_eigen
- 【USB笔记】设备功能描述符Device Capability Descriptor
- 外贸邮箱服务器设置,外贸邮客户端设置方法?
- PotPlayer播放DST音频的mkv电影解码错误
- java计算机毕业设计-线上自助旅游报名网-源程序+mysql+系统+lw文档+远程调试
- 王者荣耀角色信息在哪个服务器,怎么查询王者荣耀角色在哪个区
- Linux——进程、任务和线程
- mpvue 如何使用腾讯视频插件?
- 爆款!如何利用知乎引上万流量,我是这样做的!|实战
- 瑞友-项目经理培训 总结
- 对Unity一个Shader编译Bug的分析(Unrecognized sampler 'samplerunity_lightmap)
- DA14580外设篇之定时器和PWM
- 删除的视频怎么恢复?