博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(1)第一个例子
阅读量:4162 次
发布时间:2019-05-26

本文共 1876 字,大约阅读时间需要 6 分钟。

C++是一门博大高深的语言,提供了众多编程模式,以及其技术,其中有一项重要的技术,叫做模板技术。所谓的模板,就是提供一套函数或类,其中参数或成员是没有定义为特定类型,由使用者来定义它的类型。最开始这项技术主要用来解决容器类的问题,比如int、float类型的容器,就需要编写两个类才能解决。而采用模板技术之后,就算有N种类型,只需编写一个容器类就解决了,这样不仅提高了开发效率,也减少了代码的编写量,提高了维护性。下面介绍学习的boost库,就是使用模板技术来实现的,如果对模板技术还不够熟悉,建议先找相关的书本学习,再来学习本书里的内容。由于C++只是定义了一门语言,没有定义标准的类库,结果导致越来越不适应现代技术的发展,对代码的高质量,对解决问题的技术积累都落后在其它语言后面,比如JAVA、C#,它们都提供了大量基础类库,因此C++的类库也提到日程上了,在这段时间里,C++出现了STL类库,但还是很弱小、功能有限,紧接着业界就提供了一个强大的boost类库。熟练地使用boost库会提高软件的开发效率,提高代码的质量,提高开发人员多平台开发能力,因而会使用boost库,已经成为现代C++开发人员的一项基本技能了。

boost库里有很多吸引人的地方,但也比较多内容,比较复杂一些。为了有一个简单印象,先介绍一个简单的例子,通过这个例子看到,怎么样大大地提高开发效率。为此,从一个lambda表达式使用的例子开始吧。什么是lambda表达式,其实就是一个匿名函数。当你需要一个函数,并且只想使用一次时,但又不想声明这个函数,也不关心这个函数的名称,就可以使用这种表达方式。其实在编译器里,还是会自动生成这个函数的。使用lambda表达式的好处是可以提高开发效率,提高类型安全,提供更加局部化的作用域代码。

现在假设有一个问题,需要从键盘输入多个数字,并且通过乘以3倍后,再输出到控制台。

习惯的做法是如下:

//

class CMul

{

public: 

void operator()(const int v)

{      

     std::cout << v  * 3 << " ";

}

};

这里先声明一个函数操作对象,在对象里实现乘法,并输到控制台。

然后使用下面的语句,就可以把输入的一系数字串进行运算,并输出到控制台。

std::for_each(in(std::cin), in(), CMul());

比如输入:1 2 4

输出为:3 6 12

 

使用lambda表达式的做法是如下:

using namespace boost::lambda;  

std::for_each(in(std::cin), in(), std::cout << (_1 * 3) <<" ");

上面的代码通过引入boost库的lambda库,就可以简单到一行代码实现了上面的功能,并且阅读起来更加直接,更加优美很多。可见boost库会提高效率,不仅是编程效率,还会提高维护的效率,感觉如何?因此会从心底里爱上boost库的。

 

整例子完整的代码如下:

// boost_001.cpp : Defines the entry point for the console application.// #include "stdafx.h"//#include 
#include
#include
#include
//class CMul{public: void operator()(const int v){ std::cout << v * 3 << " ";}}; int _tmain(int argc, _TCHAR* argv[]){typedefstd::istream_iterator
in; //使用传统方式std::for_each(in(std::cin), in(),CMul()); //复位cin;if (std::cin.fail()){ std::cin.clear(); std::cin.sync();}//使用lambda表达式using namespace boost::lambda; std::for_each(in(std::cin), in(),std::cout << (_1 * 3) << " "); system("pause");return 0;}

转载地址:http://uaixi.baihongyu.com/

你可能感兴趣的文章
Detecting Memory Leaks in Kernel
查看>>
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>
There's Much More than Intel/AMD Inside
查看>>
CentOS7 安装MySQL 5.6.43
查看>>
使用Java 导入/导出 Excel ----Jakarta POI
查看>>
本地tomcat 服务器内存不足
查看>>
IntelliJ IDAE 2018.2 汉化
查看>>
Openwrt源码下载与编译
查看>>
rootkit related
查看>>
配置文件的重要性------轻化操作
查看>>
我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
查看>>
无protobuf协议情况下的反序列化------貌似无解, 其实有解!
查看>>
make -n(仅列出命令, 但不会执行)用于调试makefile
查看>>
go语言如何从终端逐行读取数据?------用bufio包
查看>>
go的值类型和引用类型------重要的概念
查看>>
求二叉树中结点的最大值(所有结点的值都是正整数)
查看>>
用go的flag包来解析命令行参数
查看>>
来玩下go的http get
查看>>
队列和栈的本质区别
查看>>