目录
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));