• 【C++ STL容器】:vector存放数据以及存放自定义的数据类型


    前言

    时不可以苟遇,道不可以虚行。


    STL 中最常用的容器为:vector,暂且把它理解为我们之前学过的数组Array

    一、创建一个vector容器(数组)

    • 添加头文件:#include
    	vector<int> v;
    
    • 1

    二、向容器中插入数据

    • 利用内置函数:push_back()
     	v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
    
    • 1
    • 2
    • 3
    • 4

    三、通过迭代器访问容器中的数据

    1、利用起始和结束两个迭代器

    • 先声明两个迭代器,一个指向容器中的第一元素一个指向容器中的最后一个元素的下一个位置
      在这里插入图片描述
    • 然后利用一层 while 循环,依次遍历容器中的元素。
    	vector<int>::iterator itBegin = v.begin();   //起始迭代器,指向容器中第一个元素
        vector<int>::iterator itEnd = v.end();       //结束迭代器,指向容器中最后一个元素的下一个位置
    	
    	while (itBegin != itEnd) {
             cout << *itBegin << endl;
             itBegin++;
         }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、直接使用 for 循环

    • 使用 for 循环,定义一个临时的起始迭代器指向容器 v 中第一个元素,当 该迭代器 指向位置到达容器 v 中的最后一个元素的下一个位置时,结束循环。
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            cout << *it << endl;
        }
    
    • 1
    • 2
    • 3

    3、利用 for_each 遍历算法

    • 需要添加头文件:#include ,标准算法的头文件
    • 创建一个打印函数作为这个算法的第三个函数参数
    	void myPrint(int val) {
    	    cout << val << endl;
    	}
    	
    	//最后一个参数为:传入函数名,回调作用
    	for_each(v.begin(), v.end(), myPrint);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 跳转 for_each 函数的定义,其实现方法也是使用一层 for 循环。
      在这里插入图片描述
    	for_each(_InputIterator __first, _InputIterator __last, _Function __f)
        {
    	      // concept requirements
    	      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    	      __glibcxx_requires_valid_range(__first, __last);
    	      for (; __first != __last; ++__first)
    		  		__f(*__first);
    	      return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    四、存储自定义数据类型

    • 定义一个 Person 类:
    class Person {
    public:
        Person(string name, int age) {
            this->m_Name = name;
            this->m_Age = age;
        }
    
        string m_Name;
        int m_Age;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    • 定义一个存储自定义数据类型的容器:
    	vector<Person> v;
    
    • 1

    • 定义 Person 类对象,作为存储数据:
    	Person p1("a", 1);
        Person p2("b", 2);
        Person p3("n", 3);
        Person p4("m", 3);
        Person p5("u", 3);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    • 向容器中添加数据:
    	v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
        v.push_back(p5);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    • 遍历容器中的数据:(提示: <> 中的数据类型是什么,(*it) 取出来的东西就是什么)
    • 例如这里:<> 中的是 Person,所以 (*it) 表示的是 Person 对象,it 表示的是 Person 对象的地址,也可以直接通过 it->m_Nameit->m_Age (地址指向)的方式,取出数据。
    	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
    	}
    
    • 1
    • 2
    • 3
    	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;
    	}
    
    • 1
    • 2
    • 3

    五、存储自定义的指针数据类型

    • 定义一个 Person 类:
    class Person {
    public:
        Person(string name, int age) {
            this->m_Name = name;
            this->m_Age = age;
        }
    
        string m_Name;
        int m_Age;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    • 定义一个存储自定义数据类型的容器:
    	vector<Person*> v;
    
    • 1

    • 定义 Person 类对象,作为存储数据:
    	Person p1("a", 1);
        Person p2("b", 2);
        Person p3("n", 3);
        Person p4("m", 3);
        Person p5("u", 3);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    • 向容器中添加数据,存放指针的话,需要在地址前面多加上一个取址符号(&
    	v.push_back(&p1);
        v.push_back(&p2);
        v.push_back(&p3);
        v.push_back(&p4);
        v.push_back(&p5);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    • 遍历容器的数据:(提示: <> 中的数据类型是什么,(*it) 取出来的东西就是什么)
    • 此时 <> 的是 Person* ,所以 (*it) 表示的是 Person 对象的地址,可以通过 (*it)->m_Name(*it)->m_Age 的方式,取出数据。
  • 相关阅读:
    Flink 1.13 源码解析——JobManager启动流程概览
    论文阅读——Large Selective Kernel Network for Remote Sensing Object Detection
    redis知识点整合
    SpringBoot的配置文件properties和yml怎么写?
    NET近期面试总结和面试题
    第142篇 合约安全-重入锁
    Java 中你绝对没用过的一个关键字?
    【DR_CAN-MPC学习笔记】2.最优化数学建模推导
    EGR-20USCM接地故障继电器
    《华为战略管理法:DSTE实战体系》作者谢宁老师受邀为某电力上市集团提供两天的《成功的产品管理及产品经理》内训。
  • 原文地址:https://blog.csdn.net/WandZ123/article/details/128082658