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

这篇具有很好参考价值的文章主要介绍了【C++ STL容器】:vector存放数据以及存放自定义的数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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


STL 中最常用的容器为:vector,暂且把它理解为我们之前学过的数组Array文章来源地址https://www.toymoban.com/news/detail-615367.html

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

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

二、向容器中插入数据

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

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

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

  • 先声明两个迭代器,一个指向容器中的第一元素一个指向容器中的最后一个元素的下一个位置
    如何用vector存数据,C++,c++,算法,开发语言
  • 然后利用一层 while 循环,依次遍历容器中的元素。
	vector<int>::iterator itBegin = v.begin();   //起始迭代器,指向容器中第一个元素
    vector<int>::iterator itEnd = v.end();       //结束迭代器,指向容器中最后一个元素的下一个位置
	
	while (itBegin != itEnd) {
         cout << *itBegin << endl;
         itBegin++;
     }

2、直接使用 for 循环

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

3、利用 for_each 遍历算法

  • 需要添加头文件:#include <algorithm>,标准算法的头文件
  • 创建一个打印函数作为这个算法的第三个函数参数
	void myPrint(int val) {
	    cout << val << endl;
	}
	
	//最后一个参数为:传入函数名,回调作用
	for_each(v.begin(), v.end(), myPrint);
  • 跳转 for_each 函数的定义,其实现方法也是使用一层 for 循环。
    如何用vector存数据,C++,c++,算法,开发语言
	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<Person> 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<Person>::iterator it = v.begin(); it != v.end(); it++) {
		cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
	}
	for (vector<Person>::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<Person*> 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 的方式,取出数据。

到了这里,关于【C++ STL容器】:vector存放数据以及存放自定义的数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ stl容器vector的底层模拟实现

    目录 前言:   1.成员变量,容量与大小 2.构造函数 无参构造: 带参的使用值进行构造:  使用迭代器区间进行构造: 3.交换 4.拷贝构造 5.赋值重载 6.迭代器 7.扩容 reserve: resize: 8.插入与删除 insert: erase: insert迭代器失效问题: erase迭代器失效问题: 9.头插头删 10.[]重载

    2024年04月15日
    浏览(42)
  • 【C++】:C++中的STL序列式容器vector源码剖析

    vector定于与stl_vector.h头文件中 例如: vector的数据结构非常简单:一个线性连续空间 下面介绍vector的3个数据结构: start:表示目前使用空间的头 finish:表示目前使用空间的尾 end_of_storage:表示目前可用空间的尾 说明:为了降低空间配置时的速度成本,vector实际配置的大小可

    2024年01月22日
    浏览(52)
  • 【C++】:STL源码剖析之vector类容器的底层模拟实现

    构造一个空vector size和capacity为0 将_start _finish _endofstorage 都置为空指针即可 传统写法 : 1). 新开辟一块和 v 同样容量的空间,更新 _start, _finish, _endofstorage 2). 将 v 中的数据拷贝到新开辟的空间中 注意 : 不要使用memcpy函数拷贝数据,如果数据是内置类型或浅拷贝的自定义类型

    2024年02月04日
    浏览(53)
  • 【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存

    2024年03月14日
    浏览(79)
  • 【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 和string的学习不同 vector即要掌握它的用法 更要会自己去实现一个vector 本章重点: 熟悉STL库中vector的接口函数 自己实现一个简易vector类 本

    2024年02月11日
    浏览(39)
  • 第一百二十二天学习记录:C++提高:STL-vector容器(上)(黑马教学视频)

    功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后续接新的空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间 vector容器的迭代器是支持随机

    2024年02月14日
    浏览(46)
  • 第一百二十三天学习记录:C++提高:STL-vector容器(下)(黑马教学视频)

    功能描述: 对vector容器进行插入、删除操作 函数原型: 总结: 尾插 push_back 尾删 pop_back 插入 insert(位置迭代器) 删除 erase(位置迭代器) 清空 clear 功能描述: 对vector中的数据的存取操作 函数原型: 总结: 除了用迭代器获取vector容器中元素,[]和at也可以 front返回容器第一个

    2024年02月13日
    浏览(45)
  • 【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 本篇文章立足于上一篇文章: list深度剖析(上) 请先阅读完上一篇文章后再阅读这篇文章! 本章重点: 本章着重讲解list的模拟实现 list模拟实

    2024年02月09日
    浏览(53)
  • <C++>map 容器快速上手|自定义数据类型排序的避坑理解

    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:C++泛型编程 🔥前言 继 set 容器后,今天总结一下 map 容器的功能,从零到一快速掌握基本使用与常用接口。 map 在 STL 编程中与 vector 、 list 、 set 具有同等重要的地位,键值对的方式

    2024年02月02日
    浏览(42)
  • 【C++】容器篇(一)—— vector 的基本概述以及模拟实现

    前言: 在之前,我们已经对 string类进行了基本的概述,并且手动的实现了string类中常用的接口函数。本期,我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类,本期的 vector 相对来说实现起来略微难一点,难点就在于要考虑关于 “ 迭代器失效 ”

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包