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 ...
随机推荐
- pyqt5-QFrame边框样式
继承 QObject-->QWidget-->QFrame 是一个基类, 可以选择直接使用,主要是用来控制一些边框样式:例如:凸起.凹下.阴影.线宽 QFrame对象效果对照图: im ...
- 【leetcode】Sliding Puzzle
题目如下: On a 2x3 board, there are 5 tiles represented by the integers 1 through 5, and an empty square ...
- Redis :Linux和Window查看版本号
一.Linux版本:查看服务端版本 **二者都可以** redis-server -v redis-server --version 查看客户端版本 **二者都可以** redis-cli -v re ...
- vue-router中$route 和 $router
1.1 $route 表示(当前路由信息对象) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的 route records(路由记录).路由信息对象:即$ro ...
- 图片转base64使用JSON传输
要传输的JSON格式: { "orderId":"0001", "cargoReceiptNo":"iVBORw0KGgoAAAA ...
- JAVA批量文件下载
1,看看我们封装的方法 方法中有三个参数:视频url,文件夹路径,视频名称. 调用方法进行下载. 2,看看结果 打印结果 文件夹下的视频下载成功 详细的参数配置可以参考我写的这篇文章:http://b ...
- 指定文件或文件夹直接提交到svn指定目录
我这里先说两种方法第一种:1.先将那个目录checkout下来2.将要添加的文件或者文件夹放到这个目录中3.右击文件执行svn菜单中的add命令4.右击文件执行svn菜单中的commit命令第二种:如 ...
- 在最新的 create-react-app 中添加 less 支持
前置知识: 把 webpack 的相关配置暴露出来 运行 git add -A 运行 git commit -m 'project init' 运行 yarn eject 然后选 y 项目中多出来两个 ...
- shell命令别名
~/.bashrc文件 [root@linuxzgf ~]# vi ~/.bashrc 在alias cp='cp -i'前加上"#"注释,重新登录即可实现复 ...
- Failed to read artifact descriptor for xxx:jar
在MyEclipse中执行Maven的install命令时,报“Failed to read artifact descriptor for xxx:jar ”的错误.这可能是在下载过程中文件出现错误 ...