• 写在前面
  • 存放内置数据类型
    • 代码
  • 存放自定义数据类型
    • 代码
  • 总结

写在前面

本文算是B站黑马C++课程STL-vector部分的一个总结, 包含自己的一些想法(都在代码里了).

存放内置数据类型

int类型为例, 直接使用vector<int> v; 即可创建存放int类型数据的vector容器, 通过push_back()函数进行赋值.

遍历容器有三种方式, 前两种需要使用vector中的迭代器进行实现.

  • begin()迭代器指向容器中的第一个元素;
  • end()迭代器指向容器中最后一个元素的后一个元素(为空), 这点类似Python中的列表索引方式,是一个左闭右开区间;

最后一种方法使用了STL的algorithm头文件中的for_each()函数, 通过给定容器的两个迭代器和自定义函数(回调函数)进行遍历.

代码

#include<iostream>
#include<vector>
#include <algorithm>using namespace std;// 自定义的打印函数, 在第三种遍历方式中会用到
void myprint(int val)
{cout<<val<<endl;
}void test1()
{// 首先创建一个vector容器并赋值vector<int> v;v.push_back(1);v.push_back(3);v.push_back(5);v.push_back(7);v.push_back(9);// // 遍历方式1: while循环, 需要指定开始和结束两个迭代器// vector<int>::iterator itBegin = v.begin();// vector<int>::iterator itEnd = v.end();// while(itBegin != itEnd)// {//     cout<<*itBegin<<endl;//     itBegin++;// }// // 遍历方式2: for循环, 直接在循环体重指定迭代器即可// for (vector<int>::iterator it = v.begin();it< v.end();it++)// {//     cout<<*it<<endl;// }// 遍历方式3: 需要algorithm头文件, 以及自定义的打印函数for_each(v.begin(), v.end(), myprint);
}int main()
{test1();return 0;
}

运行结果:

1
3
5
7
9
[Finished in 1.4s]

存放自定义数据类型

代码

#include<iostream>
#include<vector>
#include <algorithm>
#include <string>using namespace std;// 先定义一个P类
class P
{public:string name;int age;P(string name, int age){this->name = name;this->age = age;}
};void myprint(P &val)
{cout<<"name: "<<val.name<<"  age: "<<val.age<<endl;
}// 方式一: 直接存放数据
void test1()
{vector<P> v;P p1("a", 1);P p2("b", 3);P p3("c", 5);v.push_back(p1);v.push_back(p2);v.push_back(p3);// // 遍历方式1// vector<P>::iterator itBegin = v.begin();// vector<P>::iterator itEnd = v.end();// while(itBegin != itEnd)// {//     // cout<<"name: "<<(*itBegin).name<<" age:  "<<(*itBegin).age<<endl;//     cout<<"name: "<<itBegin->name<<" age:  "<<itBegin->age<<endl;//     itBegin++;// }// // 遍历方式2// for (vector<P>::iterator it = v.begin();it != v.end();it++)// {//     // cout<<"name: "<<(*it).name<<" age:  "<<(*it).age<<endl;//     cout<<"name: "<<it->name<<"  age: "<<it->age<<endl;// }// 遍历方式3for_each(v.begin(), v.end(), myprint);
}void myprint1(P* &val)
{cout<<"name: "<<(*val).age<<"  age: "<<(*val).name<<endl;
}// 方式二: 存放自定义数据类型的地址(指针), 指针的指针
void test2()
{vector<P*> v;P p1("a", 1);P p2("b", 3);P p3("c", 5);// v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);// // 遍历方式1// vector<P>::iterator itBegin = v.begin();// vector<P>::iterator itEnd = v.end();// while(itBegin != itEnd)// {//     // cout<<"name: "<<(*itBegin).name<<" age:  "<<(*itBegin).age<<endl;//     cout<<"name: "<<itBegin->name<<" age:  "<<itBegin->age<<endl;//     itBegin++;// }// // 遍历方式2// for (vector<P*>::iterator it = v.begin();it != v.end();it++)// {//     // 指针的指针//     cout<<"name: "<<(**it).name<<"  age: "<<(**it).age<<endl;//     // 外层指针解引用之后得到类的指针再取值//     cout<<"name: "<<(*it)->name<<"  age: "<<(*it)->age<<endl;// }// 遍历方式3for_each(v.begin(), v.end(), myprint1);
}int main()
{// test1();test2();return 0;
}

运行结果:

name: 1  age: a
name: 3  age: b
name: 5  age: c
[Finished in 1.2s]

总结

在进行取值的时候, 需要注意迭代器的类型是值还是地址, 如果是地址的话需要进行解引用, 或者直接用->的方式进行取值.

C++ STL容器vector篇(一) vector容器存放内置和自定义数据类型并遍历相关推荐

  1. 一篇彻底搞懂jsp内置对象

    jsp提供了9个内置对象,该对象会自动进行实例化操作 4种属性范围 page 只在一个保存属性,跳转无效 request 一次请求保存属性,跳转依旧有效 session 同一会话有效 applicat ...

  2. C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)

    `vector`初始化方法 一维向量 二维向量 参考 vector初始化方法 一维向量 #include <iostream> #include <vector>using n ...

  3. C++ STL容器vector篇(三) vector容器大小和数组大小, 插入和删除元素, 存储和读取元素

    vector容器的大小(capacity)和存放数据的大小(size) #include <iostream> #include <vector>using namespace ...

  4. C++ STL容器vector篇(二) vector容器的构造函数与赋值操作

    构造函数 构造函数的调用有四种方式: 默认构造函数(无参构造); 左闭右开区间元素拷贝给容器本身; 构造函数将n个elem拷贝给容器本身; 拷贝构造函数 代码如下: #include <iost ...

  5. C++ STL容器vector篇(四) vector容器交换, 预留空间

    交换数组 作用: 在数组的内存分配过大时采用swap()函数可以回收被过多分配的空间, 减少内存占用 #include <iostream> #include <vector> ...

  6. 容器部署不适合文件服务器,建议使用内置容器部署War文件与可执行jar

    小编典典 一个有趣的问题.这只是我对主题的看法,因此,一切都吃一盐.我偶尔使用servlet容器和嵌入式服务器来部署和管理应用程序.我敢肯定,使用servlet容器还有很多很好的理由,但我将尝试着重介 ...

  7. 【ESP 保姆级教程】玩转emqx认证篇② ——认证安全之使用内置数据库(Mnesia)的密码认证

    忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️ ❤️ 本篇创建记录 2023-01-15 ❤️ ❤️ 本篇更新记录 2022-01-15 ❤️

  8. python全栈开发基础【第十七篇】面向对象反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  9. 5、JavaScript进阶篇②——函数、事件、内置对象

    一.函数 1. 什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum);sum=7+8 ; al ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(添加均值、标准偏差)实战(dot plot)
  2. 疫情之下!国内互联网公司上班时间汇总!
  3. apache虚拟主机301跳转问题
  4. 常见web漏洞验证攻略(萌新入坑必备!)
  5. 元素不包括_干货 | FDA法规对元素杂质的限度控制及计算方法
  6. 更新整理本人所有博文中提供的代码与工具(C++,2013.11)
  7. C++设计模式之 简单工厂模式讲解(历史上最简单明白的例子)
  8. python2有什么问题_为什么有这么多 Python?(2)
  9. js生成二维码 中间有logo
  10. ubuntu 使用xdotool 用键盘代替鼠标左键
  11. 别了,腾讯!别了,深圳!我去老家当富豪了!
  12. 拂去风尘回家的风景最美
  13. 全返模式是怎样玩的?解析购盈利模式
  14. 什么是脏读,不可重复读,幻觉读?
  15. php.ini修改需要重启什么
  16. 2021年新手做seo怎么做,几大绝招快速上排名收录
  17. 2020数字中国创新大赛 • 算法赛道冠军技术方案分享
  18. 2018网易游戏开发面试题(经验)锦集
  19. 创建 spring MVC项目的基本步骤
  20. 关于在keil工程中找不到函数定义的问题

热门文章

  1. Arrays.asList()知识点
  2. 第二小节之面向对象上
  3. 关于有类路由协议和无类路由协议
  4. ERP商品管理业务逻辑封装(三十四)
  5. leetcode 208 python3
  6. mysql面试题2020_2020年MySQL数据库面试题
  7. 两个局域网如何互联_如何申请使用三大航司的机上wifi服务?
  8. python用二维码共享文档_[源码和文档分享]基于Python的QR二维码的生成与识别程序...
  9. html js 回调函数,js中回调函数的学习笔记
  10. 数据库每日一题(易错)