c++初识vector存放自定义数据类型 学习笔记

前言:

我是在哔哩哔哩黑马程序员中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() 的地址来结束循环。

技巧:(迭代器自增最好用前置递增,能节约开销)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小苏先生.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值