【C++ STL容器】:vector存放数据以及存放自定义的数据类型
创始人
2024-02-27 00:27:24
0

前言

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


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

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

  • 添加头文件:#include
	vector v;

二、向容器中插入数据

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

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

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

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

2、直接使用 for 循环

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

3、利用 for_each 遍历算法

  • 需要添加头文件:#include ,标准算法的头文件
  • 创建一个打印函数作为这个算法的第三个函数参数
	void myPrint(int val) {cout << val << endl;}//最后一个参数为:传入函数名,回调作用for_each(v.begin(), v.end(), myPrint);
  • 跳转 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.}

四、存储自定义数据类型

  • 定义一个 Person 类:
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};

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

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

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

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

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

  • 定义一个 Person 类:
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};

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

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

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

  • 遍历容器的数据:(提示: <> 中的数据类型是什么,(*it) 取出来的东西就是什么)
  • 此时 <> 的是 Person* ,所以 (*it) 表示的是 Person 对象的地址,可以通过 (*it)->m_Name(*it)->m_Age 的方式,取出数据。

相关内容

热门资讯

北京律师行业年均免费为群众提供... 12月19日,北京市律师协会发布《北京市律师行业社会责任报告》,展示“十四五”时期北京律师行业在履行...
分居期间男子与公司女员工不正当... 公司股东李某乙在与妻子李某甲分居期间,与公司女员工马某某存在不正当交往并育有子女,还向其大额转账。李...
男子带作弊设备考科目一,被考官... 花钱就能够通过科目一考试,前不久,一名男子轻信朋友考试“包过”承诺,带着隐蔽的作弊设备进入考场,没想...
一个月内收两封监管函,瑞茂通怎... 12月19日,瑞茂通(600180)公告,于2025年12月19日收到监管工作函,监管机构就公司信息...
律师的作用 我以前自己打官司都是当被告,想办法不让对方讹诈就行,感觉律师没啥用,只是在法庭替你发言而已,孩子谢浩...
120多万卡宴只卖60万!海南... 12月20日,话题#海南封关120多万卡宴只要60万#冲上热搜,引发公众热议。 据媒体报道,12月1...
女子醉驾找人“摆平”被骗7万后... 因醉酒驾驶轻信他人“可摆平”的谎言被骗,女子葛某乙不堪压力自杀身亡。在实施诈骗的苏某被判刑并赔偿后,...
政策护航,智能建造企业“出海”... 长沙晚报掌上长沙12月21日讯(全媒体记者 刘嘉)近日,长沙市智能建造产业链推进办公室印发了《关于推...