前言:
我是在哔哩哔哩黑马程序员中c++课程p187初识-vector存放自定义数据类型学会的,非常推荐。如过还想要更加了解 vector运用 的 基本知识,可以看看我的另一篇 c++初识vector存放内置数据类型 学习笔记
一、vector容器存放Persson类型
1.创建Person类型
#include<iostream>
using namespace std;
#include<vector>
//vector容器存放自定义类型
class Person
{
public:
//有参构造函数
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
2.创建 Person类型容器
(1).创建vector容器 首先包含头文件 #inlcude<vector> (2).创建 Person类型容器 v 代码如下:
//创建 Person类型容器对象
vector<Person> v;
3.创建Person 对象 并初始化
有参构造 直接将数据传入对象即可
//创建Person 对象 并初始化
Person p1("张三", 18);
Person p2("李四", 20);
Person p3("王五", 24);
Person p4("小二", 19);
Person p5("大壮", 26);
4.向Person类型容器 中添加数据
调用 容器自带的成员函数push_back() 将创建的Person 对象 进行尾插
//向容器中添加数据
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
5.进行遍历
通过迭代器访问容器中的数据进行遍历 创建 迭代器对象 it 为一级指针 (迭代器是广义上的指针)
//遍历打印
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
{
//指针解引用 方式 用对象的方式访问其成员变量
//cout << "name:" << (*it).m_Name << " age:" << (*it).m_Age << endl;
//指针 通过箭头 间接访问对象的成员变量
cout << "name:" << it->m_Name << " age:" << it->m_Age << endl;
}
}
6.代码运行结果:
二、vector容器存放Persson * 类型
1.创建Person类
具体做法如 一、中1.创建Person类型 一样 直接使用即可
2.创建 Person * 类型容器
(2).创建 Person类型容器 v 代码如下:
//创建 Person * 类型容器对象 (指针容器)
vector<Person *> v;
3.创建Person 对象 并初始化
具体做法如 一、中3.创建Person 对象 并初始化 一样 代码实现如下:
//创建Person 对象 并初始化
Person p1("张三", 18);
Person p2("李四", 20);
Person p3("王五", 24);
Person p4("小二", 19);
Person p5("大壮", 26);
4.向Person类容器 中添加数据
因为是Person类指针 所以传入对象的地址
//向容器中添加数据 将对象地址传给 指针(指针容器)
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
5.进行遍历
(1)创建 迭代器对象 it
(2)此时 it 类似为二级指针 * it 若是vector<person> 则是 一级指针 it
(3)两种方式进行指向对象的成员变量
1.解引用 解开第一层引用 变回一级指针 通过箭头 间接访问对象的成员变量
2.解引用 解开两层 变回 对象 进行访问其成员变量 代码实现如下:
//遍历
for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) //此时 it 类似为二级指针 * it 若是vector<person> 则是 一级指针 it
{
//解引用 解开第一层 变回一级指针 通过箭头 间接访问对象的成员变量
//cout << "Person * name:" << (*it)->m_Name << " age:" << (*it)->m_Age << endl;
//解引用 解开两层 变回 对象 进行访问其成员变量
cout << "Person * name:" << (* *it).m_Name << " age:" << (* *it).m_Age << endl;
}
6.代码运行结果
三、完整代码
#include<iostream>
using namespace std;
#include<vector>
//vector容器存放自定义类型
class Person
{
public:
//有参构造函数
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
void test01()
{
//创建 Person类型容器对象
vector<Person> v;
//创建Person 对象 并初始化
Person p1("张三", 18);
Person p2("李四", 20);
Person p3("王五", 24);
Person p4("小二", 19);
Person p5("大壮", 26);
//向容器中添加数据
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
//遍历打印
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
{
//指针解引用 方式 用对象的方式访问其成员变量
//cout << "name:" << (*it).m_Name << " age:" << (*it).m_Age << endl;
//指针 通过箭头 间接访问对象的成员变量
cout << "name:" << it->m_Name << " age:" << it->m_Age << endl;
}
}
void test02()
{
//创建 Person * 类型容器对象 (指针容器)
vector<Person *> v;
//创建Person 对象 并初始化
Person p1("张三", 18);
Person p2("李四", 20);
Person p3("王五", 24);
Person p4("小二", 19);
Person p5("大壮", 26);
//向容器中添加数据 将对象地址传给 指针(指针容器)
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
//遍历
for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) //此时 it 类似为二级指针 * it 若是vector<person> 则是 一级指针 it
{
//解引用 解开第一层 变回一级指针 通过箭头 间接访问对象的成员变量
//cout << "Person * name:" << (*it)->m_Name << " age:" << (*it)->m_Age << endl;
//解引用 解开两层 变回 对象 进行访问其成员变量
cout << "Person * name:" << (* *it).m_Name << " age:" << (* *it).m_Age << endl;
}
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
四、完整代码运行结果
注意事项:
在 for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)中,我们尽可能使用 it != v.begin();而不是 it < v.begin(); 因为在后面的容器中,有链表存储方式的容器,如deque,queue,stactk,此时迭代器(类似指针)所指向的地址并不是连续的,用地址比较的结果无法用来判断谁在前,谁在后,是无序的,只能通过 判断是否 == .end() 的地址来结束循环。
技巧:(迭代器自增最好用前置递增,能节约开销)