C++ 14 auto
C++14标准最近刚被通过,像以前一样,没有给这个语言带来太大变化,C++14标准是想通过改进C++11 来让程序员更加轻松的编程,C++11引入auto关键字(严格来说auto从C++ 03 开始就有了,只是C++11改变了auto的含义),auto让你的代码更加干净,更容易让你避免错误,举个例子
原来你必须这样写
1
2
|
int i = 1 ; std::complex<double> c = return_a_complex_number(); |
你现在可以这样写
1
2
|
auto i = 1 ; auto c = return_a_complex_number(); |
声明为auto的变量在编译时期就分配了内存,而不是到了运行时期,所以使用auto不再引发任何速度延迟,这也意味着使用auto的时候,这个变量不初始化会报错。因为编译器无法知道这个变量的类型。
1
|
auto i; // this will rise a compilation error |
C++11中一个做的不好的地方是,你不能使用auto来定义一个函数类型,在新的标准中你就可以了:
1
2
3
4
5
|
// Error in C++11, works in C++14 auto my_function() { ... return value; } |
只要你的函数返回一个值,编译器就知道怎么解释这个auto关键词。现在,你可以使用最新版本的Clang和GCC,
1
|
g++- 4.9 . 1 -Wall -std=c++ 14 -pedantic my_prog_name.cpp -o my_prog_name |
为了更好地使用auto来简化你的代码,让我们分别使用C++98 、C++11 和C++14 来实现同一段代码,为了说明,我们使用两个函数来改变一个vector变量
1
|
multiply_by_two(add_one(my_vector)); |
很明显,这个循环给一个vector变量的每一个值加一再乘以二 你可以写一个函数,而不是两个。这里我们不是为了追求性能,而是说明auto的用法。
在C++98中你要这样写
std::vector<int>& add_one(std::vector<int> &v) {
for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
*it += 1;
}
return v;
} void multiply_by_two(std::vector<int> &v) {
for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
*it *= 2;
}
}
上面的代码显得很啰嗦
在C++11中你可以这样写
1
2
3
4
5
6
7
8
9
10
11
12
|
std::vector< int >& add_one(std::vector< int > &v) { for (auto& it : v) { it += 1 ; } return v; } void multiply_by_two(std::vector< int > &v) { for (auto& it : v) { it *= 2 ; } } |
C++11 中显然有了进步,我们这是可以使用auto来简化循环时候的一点代码。但仍显啰嗦。
在C++14中你可以使用auto来定义一个函数类型,代码可以简化为这样:
1
2
3
4
5
6
7
8
9
10
11
12
|
auto& add_one(std::vector< int >& v) { for (auto& it : v) { it += 1 ; } return v; } void multiply_by_two(std::vector< int >& v) { for (auto& it : v) { it *= 2 ; } } |
这里是完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
// C++14 "auto" demo code # include <iostream> # include <vector> auto& add_one(std::vector< int >& v) { for (auto& it : v) { it += 1 ; } return v; } void multiply_by_two(std::vector< int >& v) { for (auto& it : v) { it *= 2 ; } } void print_vec( const std::vector< int >& v) { for ( const auto& e: v) { std::cout << e << std::endl; } std::cout << std::endl; } int main() { // Add one and multiply by two a vector of integers std::vector< int > my_vector{- 1 , 2 , 3 , 5 }; multiply_by_two(add_one(my_vector)); print_vec(my_vector); return 0 ; } |
你可以清晰的对比出,C++14比C++11 有了一点进步。
C++ 14 auto的更多相关文章
- C++11 AUTO 类型实践
auto在C++11中引入,为大家带来方便. 具体使用及注意事项参考: https://blog.csdn.net/xiaoquantouer/article/details/51647865 htt ...
- Unity3D安卓打包参数配置与兼容性的关系分析
前言 在使用Unity3D工程导出安卓安装包的时候,往往会遇到兼容性的问题,针对某些机型,要么无法打开游戏,要么会出现卡机的现象.面对这种情况,我们可以调节相关的参数来提高兼容性. 为了了解在打包时候 ...
- Oracle11g 统计信息——统计信息自动收集任务
参考文献: Oracle11g 统计信息(一)-----统计信息自动收集任务 背景: 在使用cacti监控oracle数据库IO的时候发现每天晚上10点钟的时候oracle数据库读写明显增加,如下图所 ...
- C++ Primer 5th 第2章 变量和基本类型
*****代码在Debian g++ 5.3.1 / clang++ 3.8(C++11)下编写调试***** 由于部分编译器对标准遵循的不同以及自身额外的扩展,本章书中的少数知识点与实际实现存在偏差 ...
- NGINX----源码阅读---config配置脚本
config文件为nginx的配置入口文件. 1. #!/bin/sh # Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. LC_ALL=C ...
- Item 15: 只要有可能,就使用constexpr
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果说C++11中有什么新东西能拿"最佳困惑奖" ...
- nginx 模块及运行机制 第三章
概述:nginx服务器模块.web请求处理机制及事件驱动模型.进程功能和进程间通信 一:Nginx的模块化结构设计: 1.核心模块:指的是nginx服务器运行当中必不可少的模块,这些模块提供了最基本最 ...
- virtualbox - 2台虚拟机之间通过ssh互访
virtualbox 5.2.12 一台虚拟机是Debian 9,另一台是Ubuntu 18.04. 注意: 2台虚拟机系统里要安装ssh ! sudo apt install ssh 然后在virt ...
- C++17尝鲜:类模板中的模板参数自动推导
模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...
随机推荐
- c++linux多线程基础知识
http://blog.csdn.net/lovecodeless/article/details/24929273 http://blog.csdn.net/Jiangweihll/article/ ...
- Python 运算符Ⅳ
Python比较运算符 以下假设变量a为10,变量b为20: 以下实例演示了Python所有http://www.xuanhe.net/比较运算符的操作: 以上实例输出结果: Python赋值运算符 ...
- ssh复制公钥成功后仍需输入密码
1,网上说权限问题 登录流程: 被登录机器的文件权限: //用户权限 chmod 700 /home/username //.ssh文件夹权限 chmod 700 ~/.ssh/ // ~/.ssh/ ...
- Jackson和fastjson简单用法及性能对比
背景: Java处理JSON数据有三个比较流行的类库FastJSON.Gson和Jackson.fastjson是阿里做的国有开源Java工具包,jackson是spring mvc内置的json转换 ...
- MariaDB(Mysql)-主从搭建
卸载过程: 停止服务:systemctl stop mariadb 查询安装包:rpm -qa | grep mariadb 卸载: rpm -e mariadb-server rpm -e mari ...
- Proxy-代理器(预计vue3.0实现双向绑定的方式)
todo 常见的基于数据劫持的双向绑定有两种实现,一个是目前Vue在用的Object.defineProperty,另一个是ES2015中新增的Proxy,而Vue的作者宣称将在Vue3.0版本后加入 ...
- [Codeforce526F]:Pudding Monsters(分治)
题目传送门 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵.唯一一个神一般存在的Administrator被消灭了,靠原本的 ...
- [HDU4336]:Card Collector(概率DP)
题目传送门 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物.商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值$W_i$(每种礼物的喜悦值不能重复获得).每 ...
- 手动创建Maven项目并建立两个项目之间的依赖关系
用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId -&g ...
- JAVA 第十一周学习总结
20175308 2018-2019-2 <Java程序设计>第十一周学习总结 教材学习内容总结 13.1 URL类: URL类是java.net包中的一个类,用URL创建的对象可以获取U ...