《C++11/14高级编程Boost程序库探秘》之第1章全新的C++语言(三)学习记录

《C++11/14高级编程Boost程序库探秘》之第1章全新的C++语言(三)学习记录

1.7函数式编程

函数式编程是与面向过程编程、面向对象编程和泛型编程并列的一种编程范式,它基于λ演算理论,把计算过程视为数学函数的组合运算。

1.7.1 lambda表达式

基本形式为:

[](params){...}

[]称为lambda表达式引出操作符,圆括号里是函数的参数,花括号内则是函数体,可以使用任何C++语句。

lambda表达式的类型称为闭包,无法直接写出,所以通常需要使用auto的类型推导功能来存储。示例如下:

[[email protected] C++11]# cat lambdademo.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

auto f1 = [](int x)
{
return x*x;
};//表达式结束,语句末尾需要用分号

auto f2 = [](string s)
{
cout<<"lambda:"<<s<<endl;
};

auto f3 = [](int x, int y)
{
return x<y;
};

int main()
{
cout<<f1(3)<<endl;
f2("lambda demo");
cout<<f3(1,5)<<endl;

vector<int> v = {1,3,5,7};
for_each(v.begin(), v.end(), [](int x){cout<<x<<",";});
for_each(v.begin(), v.end(), [](int& x){if(x>3){x *= 2;}});
return 0;
}
[[email protected] C++11]# g++ lambdademo.cpp -o lambdademo -std=c++11

1.7.2 捕获外部变量

lambda表达式的完整声明语法是:

[captures](params) mutable->type {...}

captures被称为捕获列表,可以捕获表达式外部作用域的变量,在函数体内部直接使用,这是与普通函数或函数对象最大的不同之处。

捕获列表里可以有多个捕获项,以逗号分隔,规则如下:

[]     :无捕获,,函数体内部不能访问任何外部变量

[=]    :以值(拷贝)的方式捕获所有外部变量,函数体内部可以访问,但是不能修改

[&]     :以引用的方式捕获所有外部变量,函数体内可以访问并修改(需当心无效引用)

[var]   :以值(拷贝)的方式捕获某个外部变量,函数体内部可以访问,但是不能修改

[&var]  :以引用的方式捕获某个外部变量,函数体内可以访问并修改

[this]    :捕获this指针,可以访问类的成员变量和成员函数

[=,&var] :引用捕获变量var,其他外部变量使用值捕获

[&,var]   :值捕获变量var,其他外部变量使用引用捕获

lambda表达式还可以使用关键字mutable修饰,它为值方式捕获添加了一个例外情况,允许变量在函数体内也能修改,但这只是内部的拷贝,不会影响外部的变量,示例如下:

[[email protected] C++11]# cat lambda_multable_demo.cpp
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int x = 0;
auto f1 = [=]() mutable {return ++x;};//仅在内部修改,不影响外部变量
f1();
cout<<"multable x:"<<x<<endl;

//auto f2 = [=](){return ++x;};//编译错误,increment of read-only variable ‘x’
//f2();
//cout<<"value x:"<<x<<endl;

auto f3 = [&](){return ++x;};
f3();
cout<<"ref x:"<<x<<endl;
return 0;
}
[[email protected] C++11]# g++ lambda_multable_demo.cpp -o lambda_multable_demo -std=c++11
[[email protected] C++11]# ./lambda_multable_demo
multable x:0
ref x:1

1.8 并发编程

线程本地存储是指变量在进程里拥有不止一个实例,每个线程都会拥有一个完全独立的,线程本地化的拷贝,多个线程对变量的读写互不干扰,完全避免了竞争、同步的麻烦,示例如下:

[[email protected] C++11]# cat thread_local_demo.cpp
#include <iostream>
#include <algorithm>
#include <thread>
using namespace std;

int main()
{
extern int x;
static int y = 0;
thread_local int z = 0;

auto f = [&](){++y;++z;cout<<y<<","<<z<<endl;};

thread t1(f);
thread t2(f);

t1.join();
t1.join();

cout<<y<<","<<z<<endl;
return 0;
}
[[email protected] C++11]# g++ thread_local_demo.cpp -o thread_local_demo -std=c++11 -lpthread
[[email protected] C++11]# ./thread_local_demo
./thread_local_demo: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.22‘ not found (required by ./thread_local_demo)  //在Redhat7.3未升级glibc的情况下是不支持thread函数的,需要升级glibc的版本才行。

实际线程t1的输出为1,1  实际线程t2的输出为2,1   实际主线程的输出为2,0

thread_local的变量的生命周期比较特殊,它在线程启动时构造,在线程结束时析构,即仅在线程的生命周期内是有效的。

thread_local仅适用于线程需要独立存储的情况,当线程间需要共享资源访问时仍然需要使用互斥量等保护机制。

1.9 面向安全编程

1.9.1 无异常保证

void func() noexcept {}   //函数决定不会抛出任何异常

 1.10 杂项

在C++98中,模板参数列表里不能出现两个连续的右尖括号>>,否则编译器会把它解释为右移运算符,这导致在写某些复杂的模板类时,模板参数列表末尾的多个>之间必须用空格分隔,但是在C++11/14中弥补了这个缺陷,在模板声明里遇到>>时,会优先解释为模板参数列表的结束标记。

原文地址:https://www.cnblogs.com/snake-fly/p/12622960.html

时间: 2024-11-04 11:44:07

《C++11/14高级编程Boost程序库探秘》之第1章全新的C++语言(三)学习记录的相关文章

python2.7高级编程 笔记一(Python中的with语句与上下文管理器学习总结)

0.关于上下文管理器上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象. with manager as var: do_something(var) 相当于以下情况的简化: var = manager.__enter__() try: do_something(var) finally: manager.__exit__() 换言之,PEP 343中定义的上下文管理器协议允许将无聊的try...except...finally结构抽象到一个单独的类中,仅

学习python-20191203(1)Python Flask高级编程开发鱼书_第01章 Flask的基本原理与核心知识

视频01: 做一个产品时,一定要对自己的产品有一个明确的定位.并可以用一句话来概括自己产品的核心价值或功能. 鱼书网站几个功能 1.选择要赠送的书籍,向他人赠送书籍(价值功能,核心价值的主线): 2.书籍搜索(价值辅助功能): 3.选择自己想要的书籍,向他人索要书箱(价值辅助功能). ———————————————————————————————————————————————————————————— 视频02: 一.开始flask项目的步骤: 1.安装python环境: 2.检验python

Boost程序库完全开发指南——深入C++“准”标准库(第3版)

内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Boost 社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串处理.正则表达式.容器与数据结构.并发编程.函数式编程.泛型编程.设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简捷.优雅.灵活和高效. <Boost程序库完全开发指南——深入C++“准”标准库(

《UNIX环境高级编程(第3版)》

<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison-Wesley Professional Computing Series) 原出版社: Addison-Wesley Professional 作者: (美)W. Richard Stevens    Stephen A. Rago 译者: 戚正伟 张亚英 尤晋元 出版社:人民邮电出版社 ISBN:9787

ASP.NET MVC5 高级编程 第3章 视图

参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视图本身并不被访问,浏览器,并不能直接指向一个视图并渲染它.相反视图被控制器渲染,因为控制器提供了渲染所需要的数据. 一般情况下,控制器需要向视图提供一些信息,所以这会传递一个数据转移对象,叫做模型.完成这一过程需要两部分操作,其中一个是检查由控制器提交的模型对象,另一个是将其内容转化为HTML格式. 3.2

ASP.NET MVC5 高级编程 第2章 控制器

参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的控制器(controller)主要负责响应用户的输入,并且在响应时修改(Model).通过这种方式,MVC 中的Controller 主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)数据来源的提供 MVC 模式中 URL 首先告诉路由去实例化哪个控制器,调用哪个方法,并为该方法提供需要的参数

ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTTP Post 请求 EF 对于外键关系,数据库名称等也有约定.这些约定取代了以前需要提供给一个关系对象映射框架的所有映射和配置. GET 方法:GET 请求的所有参数都在URL中,因此可以为GET 请求建立书签. POST 方法:浏览器把输入值放入 HTTP 请求的主体中. 5.2 辅助方法 可以通过视图的H

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU

《C#高级编程》读书笔记

<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16位有符号的整数 -32 768~32 767(−215−215~215−1215−1) int System.Int32 32位有符号的整数 -2 147 483 648~2 147 483 647(−231−231~231−1231−1) long System.Int