1、容器算法迭代器分离案例

案例:统计某个元素在数组里出现的次数
简易版(帮助理解,无STL)

#include<iostream>
using namespace std; //算法 负责统计某个元素出现多少次
int mycount(int* start,int * end,int val)
{
int num = 0;
while (start != end)
{
if (*start == val)
num++;
start++;
}
return num;
} int main()
{
//数组 容器
int arr[] = { 1,2,4,5,3,8,9,1,4,4 }; int* pBegin = arr;//指针 迭代器
int* pEnd = &arr[(sizeof(arr) / sizeof(arr[0]))]; int num = mycount(pBegin, pEnd, 4);
cout << num << endl; return 0;
}

进阶版(利用STL 算法容器迭代器)
分为text01函数(普通数据),text02函数(类类型数据)两个版本
遍历方法也分别提供两种

#include<iostream>
#include<vector>//动态数组 容器vector
#include<algorithm>//算法
using namespace std; //回调函数
void myprint(int v)
{
cout << v << endl;
} //stl基本语法
void text01()
{
//定义容器
vector<int> v;
v.push_back(10);
v.push_back(34);
v.push_back(40);
v.push_back(40); //通过STL提供的for_each算法
//容器提供迭代器
//vector<int>::iterator迭代器类型
vector<int>::iterator pBegin = v.begin();
vector<int>::iterator pEnd = v.end(); //容器中可能存在基础的数据类型,也可以放自定义的数据类型
//for_each(start,end,回调函数)
//算法
for_each(pBegin, pEnd, myprint);
} class Person
{
public:
int age;
int id;
Person(int age,int id):age(age),id(id)
{ }
}; void text02()
{
//创建容器,类型为person
vector<Person> v;
Person p1(30, 1), p2(23, 2), p3(54, 3), p4(30,4);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4); //自己写算法遍历
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
{
cout << (*it).age << " " << (*it).id << endl;
}
} int main()
{
text01();//基本数据类型
text02();//类
return 0;
}

2、专栏回顾:第一章到第二章2.2

1.迭代器可以理解为指针,对指针的操作基本都可以对迭代器操作。
实际上迭代器是一个类,这个类封装一个指针。

2.容器分为
序列式容器(由进入的时机和地点决定)
关联式容器(容器本身有规则,进入容器要遵守规则)
3.使用迭代器

//vector<int>::iterator迭代器类型
vector<int>::iterator pBegin = v.begin();
//指向第一个元素的迭代器
vector<int>::iterator pEnd = v.end();
//v.end最后元素的下一个位置

4.for_each算法调用迭代器

//回调函数
void myprint(int v)
{
cout << v << endl;
}
//for_each(start,end,回调函数)
for_each(pBegin, pEnd, myprint);

5.深入理解
任务:尝试用容器存放person类型指针,并且打印for_each

不理解C++类对象和类指针的区别的同学可以看一下这篇文章
C++类对象和类指针的区别

这里text02函数作为比较方便理解
text03函数为本题题解

#include<iostream>
#include<vector>//动态数组 容器vector
#include<algorithm>//算法
using namespace std; //回调函数
void myprint(int v)
{
cout << v << endl;
} class Person
{
public:
int age;
int id;
Person(int age, int id) :age(age), id(id)
{ }
}; void text02()
{
//创建容器,类型为person
vector<Person> v;
Person p1(30, 1), p2(23, 2), p3(54, 3), p4(30, 4);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4); //自己写算法遍历
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
{
cout << (*it).age << " " << (*it).id << endl;
}
} void myprint2(Person* v)
{
cout << (*v).id<<" "<<(*v).age<<endl;
} void text03()
{
//创建容器,类型为person*
vector<Person*> v; Person* p1 = new Person(20,3);
Person* p2 = new Person(24, 4);
Person* p3 = new Person(50, 5);
Person* p4 = new Person(70, 6); v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4); //使用迭代器
vector<Person*>::iterator start = v.begin();
vector<Person*>::iterator end = v.end(); //算法
for_each(start, end, myprint2);
}
int main()
{
text02();//类(对比用)
text03();//容器存放person类型指针,并且打印for_each
return 0;
}

谢谢阅读(〃’ ▽ '〃)如有纰漏欢迎指出,觉得还不错就点个赞吧。

1.2 简单的STL案例的更多相关文章

  1. Python3+Dlib实现简单人脸识别案例

    Python3+Dlib实现简单人脸识别案例 写在前边 很早很早之前,当我还是一个傻了吧唧的专科生的时候,我就听说过人脸识别,听说过算法,听说过人工智能,并且也出生牛犊不怕虎般的学习过TensorFl ...

  2. 使用Java实现简单的斗地主案例

    使用Java实现简单的斗地主案例 案例说明:使用Java实现简单的斗地主洗牌发牌的操作: 具体规则: 共有54张牌,顺序打乱: 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后留三张为底牌(地主牌) ...

  3. JavaScript图片库(简单的应用案例)

    这个图片库小例子的效果如图所示,点击网页上某个图片链接时你将看到两种效果:占位符图片呗替换成这个链接所指向的图片,同时描述性文字也被替换为这个链接的title属性值.     利用一个简单的图片库应用 ...

  4. 如何用DAX实现查看每个月中不同类别排名前一位,以及一个简单的svg案例

    现在给大家带来的是如何用DAX实现查看每个月中不同类别的排名前一位,最终完成效果如下!!! 首先我们需要两张简单的表 基数表 和类别表 当我们创建好表之后,我们再创建一个表格,然后我们将类别表里的列值 ...

  5. Linux SNAT/DNAT简单理解与案例分析。

      在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP数据包通过路由器或防 ...

  6. 图像处理 - ImageMagick 简单介绍与案例

    在客户端我们可以用 PhotoShop 等 GUI 工具处理静态图片或者动态 GIF 图片,不过在服务器端对于 WEB 应用程序要处理图片格式转换,缩放裁剪,翻转扭曲,PDF解析等操作, GUI 软件 ...

  7. hdu1237 简单计算器[STL 栈]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1237 题干 代码和解释 解本题时使用了STL 栈,要记得使用#include<stack>. 解本题时使用了isdigit()函 ...

  8. javaweb学习总结(二十七)——jsp简单标签开发案例和打包

    一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...

  9. ChartControl简单的圆柱案例

    由于工作需要,最近学习了DevExpress控件中的ChartControl,并做了简单尝试,通过程序动态添加数据源到chartControl控件中,绘制了如下的条形图. 条形图的颜色等外观可在cha ...

随机推荐

  1. 【转】linux shell编程实例总结

    查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数 find ./ -size +500M -type f | tee file_list | wc 在目录/tmp下找 ...

  2. nodejs的安装及创建项目

    安装windows nodejs教程:1.官网下载windows安装:2.CMD中输入:npm -g install koa -generator 创建项目:1.首先新建文件夹2.CMD中输入CD 文 ...

  3. 浅谈Java中重写与重载的区别

    重载和重写是Java中两个截然不同的概念.但是却因为名字相近导致很多人经常混淆. 下面用例子展示出他们之间的区别. 在Java中,重载(overloading) 发生在本类.方法名相同,参数列表不同, ...

  4. Docker名词解释

    http://www.runoob.com/docker/docker-architecture.html  

  5. Solution -「ZJOI 2019」「洛谷 P5326」开关

    \(\mathcal{Description}\)   Link.   有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...

  6. pypi服务器搭建

    pypi服务器搭建 [root@localhost ~]# hostnamectl set-hostname --static pypi-server [root@pypi-server ~]# yu ...

  7. systemd配置文件填写了ExecStop=/usr/bin/kill -9 $MAINPID之后重启在messages发生了报错

    原因在于systemd模块需要增加自动化检测,检测有一项为检测messages日志内是否有systemd的failed 写了一个检测脚本,脚本的检测messages内容为/bin/cat /var/l ...

  8. gulp更新4.0后的报错(gulp报Did you forget to signal async completion?)

    本文首发于青云工作室 原文链接为 https://qystudio.ltd/posts/55153.html 缘起 今天我升级了gulp到4.0,在git三件套之后,网站并没有更新,我便登录了gith ...

  9. Python数据分析 | Numpy与1维数组操作

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...

  10. NSSCTF-原来你也玩原神

    是一个杂项的题目,看到题目名字的时候,以为是和之前遇到的一个杂项题里面的原神的编码有关,然后发现不是的,给的是一个压缩包文件,使用winhex打开,并没有看到压缩包的文件头也没有看到,使用一般常用的b ...