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. ReactiveCocoa 学习资料

    之前就有听说,感觉很强大,ReactiveCocoa更加被Mattt Thompson大神称为开启一个新Objective-C纪元.所以觉得非常有学习的必要了. 一些很好的学习资料: Reactive ...

  2. Nginx+Tomcat 实现负载均衡 ,动静分离集群部署

    Nginx + Tomcat 实现负载均衡,动静分离集群部署 1.Nginx实现负载均衡原理 2.Nginx配置反向代理主要参数 3.实验 1.Nginx实现负载均衡原理: Nginx服务器作为前端, ...

  3. BGP路由协议(Border Gateway Protocol)

    BGP路由协议(Border Gateway Protocol) 目录 BGP路由协议(Border Gateway Protocol) 一.BGP概述 1.自治系统(AS,autonomous sy ...

  4. idea导入mavenJar、mavenWeb项目

    两种项目都是一样的,都是maven项目,所以主要是找到pom.xml,项目最好先放在idea的工作目录下,且工作目录最好为英文 1.打开idea,选择import project 2.把项目放到ide ...

  5. CoRR 2015 | MXNet: A Flexible and Efficient Machine Learning Library for Heterogeneous Distributed Systems

    MXNet是一个支持多种编程语言的机器学习库,使用MXNet可以方便地实现机器学习算法,尤其是深度神经网络.通过嵌入在宿主语言中,它将声明式符号表达与命令式张量计算相结合.它提供自动求导以计算梯度.M ...

  6. CPU使用率过高怎么办

    实际上前文中关于CPU使用率过高如何通过各种工具获得相关的热点进程.那么进程有了,那得疑惑到底哪个哪段代码导致了这个进程成为热点呢? 如果在调试阶段,可以使用gdb中断运行,但是在生产环境肯定不行.L ...

  7. 数字化转型——医院数字化管理平台HDMP建设历程

    ​ 最近几年一直在做医疗行业的B端应用,在搭建医院数字化转型管理平台的过程中累积了一些知识,准备抽时间不断的把整个平台搭建过程及思想记录下来,帮助自己记忆,也希望对相应知识点有需要的伙伴能有一个启发. ...

  8. 攻防世界之Web_PHP2

    题目: 扫描目录发现index.phps,进入查看发现源码. 代码审计:GET传一个id,id通过url解码后为admin,所以传?id=admin 通过url加密两次的值 使用burpsuite编码 ...

  9. msf生成后门实战漫游内网

    前言:当我们在渗透当中首先拿到webshell权限,进一步提权渗透,获得内网的主机,假设在这里我们获取了具有双网卡的web服务器,我们的目的是通过这台web服务器,进行内网漫游,获取内网中其他主机的系 ...

  10. Flash挂马实验

    实验目的 了解Flash木马的原理和危害 实现实验所提到的命令和工具,得到实验结果 实验原理 利用Flash挂马的原理并模拟实现挂马 实验内容 掌握Flash挂马的原理并模拟实现挂马 实验环境描述 1 ...