Boost程序库学习-foreach

2024-03-15 07:32
文章标签 学习 foreach boost 程序库

本文主要是介绍Boost程序库学习-foreach,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

foreach

C#,java等对容器中的元素遍历都进行了较好的支持,一个foreach,C++的新标准也采用了for(auto &),但是对于旧的标准我们依旧无法进行简便 的处理。
boost的foreach应运而生。

1.使用

foreach提供宏:BOOST_FOREACH,实现正向遍历。

void foreachTest()
{using namespace boost::assign;map<int,string>v=map_list_of(1, "one")(2, "two")(7, "three");typedef map<int,string>::value_type define_pair;BOOST_FOREACH(define_pair& node,v){cout<<node.first<<",";}cout<<endl;BOOST_AUTO(it,v.begin());for(;it!=v.end();it++){cout<<it->first<<" ";}cout<<endl;string str("boost foreach");BOOST_FOREACH(char &c,str){cout<<c<<" -";}cout<<endl;
}
void foreachSetTest()
{using namespace boost::assign;set<int> set=(list_of(10),20,30);// BOOST_AUTO(y)BOOST_FOREACH(int x,set){cout<<x<<" ";}cout<<endl;BOOST_AUTO(y,*set.begin());BOOST_FOREACH(y,set){cout<<y<<" ";}cout<<endl;
}

BOOST_AUTO着实是一个好玩的函数,能够自动的获知变量的类型。这一函数完全取代了以前的

set<int>::iterator y=set.begin()

FOREACH简化了

for(y;y!=set.end();y++)
{}

2.进一步优化方法

有时候写BOOST_FOREACH如果觉得太长,可以进行宏定义

#define foreach BOOST_FOREACH

代码为:

void graceFroeachTest()
{//使用宏定义using namespace boost::assign;//vector testvector<int> vec=(list_of(1),2,3,5);foreach(int& x,vec){cout<<x<<" ";}cout<<endl;//map testmap<int,string>m=map_list_of(1,"111")(2,"222")(3,"333");// typedef map<int,string>::value_type vt;// foreach(vt&vt,m)// {//     cout<<vt.first<<"-"<<vt.second<<endl;// }pair<int,string>vt;foreach( vt,m){cout<<vt.first<<"-"<<vt.second<<endl;}
}

3.自定义结构体

如果是自定义的类,使用方式类似:

class A
{public:A(int data ):_data(data){}~A(){cout<<"deconstruct A:"<<_data<<endl;}public:int _data;  
};
int foreachClassTest()
{A *a1=new A(1);A *a2=new A(2);std::vector<A*>_vecA;_vecA.push_back(a1);_vecA.push_back(a2);foreach(A *a,_vecA){cout<<"data is:"<<a->_data<<endl;delete a;a=NULL;}return 0;
}
程序运行结果为:
data is:1
deconstruct A:1
data is:2
deconstruct A:2

4.注意事项

  • BOOST_FOREACH循环中不能改变序列的长度,即不能增加减少容器中的元素,这一点很容易理解,因为会破坏遍历iterator,导致失效。
  • 只接受两个参数,因此对于map等容器,可以采用的方式如下:
typedef map<int,string>::value_type vt;
pair<int,string>vt;
  • 最好不要把(pair<int,string>x)放在boost_foreach里面,会导致模板类失效。

这篇关于Boost程序库学习-foreach的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811232

相关文章

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert