在C++中实现foreach循环,比for_each更简洁!

2023-10-26

原文:http://blogread.cn/it/article/2570?f=sr

python,c#,java里面都有类似于foreach的结构,stl里面虽然有for_each这个函数,但是感觉使用还是太繁琐了一些,所以就自己实现了一个。 先来看看stl里面的for_each函数,官方文档上的原型如下:

Function for_each (InputIterator first, InputIterator last, Function f);

示例代码如下:

// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
void myfunction (int i) {
  cout << " " << i;
}
 
struct myclass {
  void operator() (int i) {cout << " " << i;}
} myobject;
 
int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);
 
  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
 
  // or:
  cout << "\nmyvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);
 
  cout << endl;
 
  return 0;
}

不只函数原型有点不习惯,而且还要再写一个函数,比起python的实现方式,的确有点繁琐了:

for d in l:
    print d

我们来自己实现一个,方法肯定是用宏啦,我们来看一下第一个版本:

#define foreach(container,it,type) \
    for(type::iterator it = (container).begin();it!=(container).end();++it)
 

示例代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
using namespace std;
 
#define foreach(container,it,type) \
    for(type::iterator it = (container).begin();it!=(container).end();++it)
 
int main(int argc, const char *argv[])
{
    set<string> s;
    s.insert("w");
    s.insert("a");
    s.insert("n");
 
 
    foreach(s,it,set<string>)
    {
        cout<<*it<<endl;
    }
 
    /*map<unsigned,string> m;
    m[0]="x";
    m[1]="w";
 
    foreach(m,it,map<unsigned,string>)
    {
        cout<<it->first<<","<<it->second<<endl;
    }*/
 
    return 0;
}

如果把注释掉的代码打开的话,就会报错,应该是宏无法处理逗号的原因。
而且调用起来还是有点繁琐对吧,python里面并没有要求传入容器类型,我们是不是也能把set这个参数省掉呢?
先来看一下这段代码:

typeof(10) a;
a = 100;
cout<<a<<endl


这段代码是可以执行的,运行结果是100。从这一点出发,我们是不是能通过typeof(container)获得容器类型,然后通过typeof(container)::iterator创建遍历指针呢,我们来看第二个版本
#define foreach(container,it) \
    for(typeof(container)::iterator it = (container).begin();it!=(container).end();++it)

然而很不幸,这段代码是无法运行的,编译结果如下:

test4.cpp|21| error: expected initializer before "it"
test4.cpp|21| error: `it' was not declared in this scope
test4.cpp|34| error: expected initializer before "it"
test4.cpp|34| error: `it' was not declared in this scope

有没有办法解决呢?
有的,我们用一个曲线救国的方法!typeof(container.begin()) ,哈哈!最终代码如下:

#define foreach(container,it) \
    for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)

测试代码如下:

#include <vector>
#include <set>
#include <map>
using namespace std;
 
#define foreach(container,it) \
    for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)
 
int main(int argc, const char *argv[])
{
    set<string> s;
    s.insert("w");
    s.insert("a");
    s.insert("n");
 
 
    foreach(s,it)
    {
        cout<<*it<<endl;
    }
 
    map<unsigned,string> m;
    m[0]="x";
    m[1]="w";
 
    foreach(m,it)
    {
        cout<<it->first<<","<<it->second<<endl;
    }
 
    return 0;
}

输入结果如下:

a
n
w
0,x
1,w

OK!一切正常!这应该是形式比较简单的版本啦,如果各位有什么更好的建议,欢迎留言交流~
ps:
当然,其实你连it这个参数都可以省掉,但是根据pythonic的原则(好吧,我知道自己是在写C++),要简单但不能让人迷惑,所以建议还是把it这个参数保留。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C++中实现foreach循环,比for_each更简洁! 的相关文章

  • 什么是推荐系统?推荐系统类型、用例和应用

    推荐系统是机器学习的一类 它可使用数据来帮助预测 缩小范围 并找到人们在呈指数级增长的选项中寻找的内容 什么是推荐系统 推荐系统是一种人工智能或人工智能算法 通常与机器学习相关 使用大数据向消费者建议或推荐其他产品 这些推荐可以基于各种标准
  • 构建IoT系统必须的五项内容 (Page 3)

    本文译至 http japan zdnet com article 35076390 3 2 高度的分析实现 抽取出的高精度特征值适用于机器学习算法 从时间序列数据计算异常度 自动检查异常状况或变化点 图5 等 能应用于人眼难以判断的现象的
  • C++中如何进行txt文件的读入和写入

    大家可能大部分写代码都是在devc或者 vs里面直接输入数据 这一般常见于简单算法和数据的处理 但是一旦处理大数据的话 几百万 几千万 上亿个数据手打似乎不能轻易实现的 那么这篇文章我们来搞懂C 环境下如何进行io流读取txt文件 其实我们

随机推荐

  • MYSQL:如何清空表中的数据(一张表和多张表)

    方法1 delete from 表名 方法2 truncate table 表名 比 较 1 gt truncate 是整体删除 速度较快 delete是逐条删除 速度较慢 2 gt truncate 不写服务器 log delete 写服
  • 如何设置笔记本电脑扩展屏幕的亮度

    方法一 通过外设显示屏的本身按钮直接调节 方法二 打开控制面板 查看方式 小图标 英特尔 显卡设置 颜色设置 选择显示器 亮度 对比度调节 或鼠标右键找到英特尔 显卡设置
  • C++ 51.基于多态的职工管理系统(7)——删除职工功能

    功能描述 按照员工的编号进行删除职工操作1 删除职工函数声明 在workerManager h中添加成员函数 删除职工 void Del Emp 2 职工是否存在函数声明 按照职工编号判断职工是否存在 在workerManager h中添加
  • matlab数字和字符串转换

    一 数字转字符串 1 整数转字符串 int1 10 num2str int1 2 小数转字符串 dec1 1 23456 1 方法1 num2str dec1 6 保留6位有效数 2 方法2 num2str dec1 6f 保留小数点后6位
  • 解决axios发送数据到后端中文乱码问题

    解决axios发送数据到后端中文乱码问题 axios请求 const that this axios method post url http localhost 8080 2 SelectByIdServlet data this stu
  • Altium Designer22中修改元件库后,更新原理图的2种方法及这2种方法的区别。

    PCB设计过程中 经常会涉及到修改原理图库和PCB库的情况 那么修改了这些库之后 如何更新到已经绘制好的原理图中呢 更新过程中 如果想保留设置好的description footprint和value等属性 又该如何设置呢 方法一 在原理图
  • python3:retrying模块

    retrying是一个python的重试包 可以用来自动重试一些可能运行失败的程序段 retrying提供一个装饰器函数retry 被装饰的函数就在运行失败的情况下将重新执行 默认只要一直报错就会不断重试 Web sit https git
  • FPGA零基础学习之Vivado-RTC实时时钟系统设计

    FPGA零基础学习之Vivado RTC实时时钟系统设计 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业
  • mobx的使用

    mobx的使用 1 API mobx react Provider 包裹根组件 用于传递数据 observer 组件变为响应式 inject 接收mobx实例 用于类组件 MobXProviderContext mobx observabl
  • 远程控制---实验九:IPC远程植入木马

    目录 一 实验目的及要求 二 实验原理 IPC 空会话 IPC建立的过程 木马 三 实验环境 四 实验步骤及内容 五 实验总结 六 分析与思考 一 实验目的及要求 1 掌握利用 IPC 入侵目标计算机 windows XP 或 window
  • Java虚拟机内存参数设置

    Java虚拟机内存参数设置 前言 Java虚拟机 JVM 是一种抽象的计算机器 JVM是一个程序 对于编写在其中执行的程序来说 它看起来像一台机器 通过这种方式 Java程序被写入相同的接口和库集 针对特定操作系统的每个JVM实现都将Jav
  • 使用nginx反向代理docker安装的jenkins

    描述 使用nginx反向代理jenkins nginx反向代理 docker安装的jenkins 方法 一 nginx反向代理docker安装的jenkins 1 使用 vim etc nginx nginx conf进入nginx 的配置
  • Typescript类型注解和类型推断

    在TypeScript中有两个基本概念 类型注解和类型推断 这两个概念在我们使用TypeScript代码时会一直使用 一 类型注解 type annotation 如 let count number count 123 这种就是类型注解
  • QT运行出现The CDB process terminated解决办法(亲测有效)

    QT运行出现The CDB process terminated解决办法 运行程序时出现如图所示的问题 检查2件事 1 检查编译器和调试器 工具 选项 构建和运行 如果是电脑图标证明不是这里的问题 如果出现黄色的感叹号证明编译器和调试器没有
  • XNA简介

    href file C DOCUME 1 ADMINI 1 LOCALS 1 Temp msohtml1 02 clip filelist xml rel File List gt XNA简介 XNA简介 首先声明 XNA不是游戏引擎 它只
  • linux g++编译以及库多重依赖

    目录 一 编译命令 二 编译相关选项 三 静态库和动态库的编译命令 1 生成动态库和静态库 2 fPIC选项 3 如何解决运行时找不到链接库的问题 四 库多重依赖 1 动态库依赖动态库 2 动态库依赖静态库 3 静态库依赖静态库 一 编译命
  • 用了很多年的PC端离线版个人知识管理软件PKM2 Manager推荐给大家

    对于从事IT行业的童鞋来说 每人每天每月都会遇到大量的新知识与旧知识出现在眼前 从而就会出现知识容易遗忘 经验容易流失的情况 比如 曾经遇到过的某类问题 今天再次出现了 或曾经做过一次事情步骤 今天要再次重新做一遍等等 对这些众多的知识若没
  • 最难用的鼠标键、设置半天、反人类逻辑(罗技)

    目的 高效设置罗技鼠标键 提高复制粘贴效率 准备软件 Logitech G HUB Logitech 支持 下载 1 右上角 点击箭头 点击管理配置文件 2 左下角 点击加号 创建配置文件 办公 3 点击办公 4 右上角选择 办公 底部点击
  • YOLO算法概述与细节

    R CNN系列算法是two stage 两步走算法 yolo和ssd属于one stage算法 yolo v1 把图片分成若干个小区域 每个小区域负责检测是否有物体的中心点落在其中 每个小区域可预测多个box 但是只能检测一个物体 算法首先
  • 在C++中实现foreach循环,比for_each更简洁!

    原文 http blogread cn it article 2570 f sr python c java里面都有类似于foreach的结构 stl里面虽然有for each这个函数 但是感觉使用还是太繁琐了一些 所以就自己实现了一个 先