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 ...
随机推荐
- day_04 基本数据类型的结构和使用方法
1. 简述Python的五大数据类型的作用.定义方式.使用方法: 1). 数字类型: 整型(int): 表示年龄.号码.级别:变量名=值,变量名=int(值):加减乘除.逻辑判断: 浮点型(float ...
- hdu 1724 : Ellipse 【Simpson积分】
题目链接 题意:给出椭圆方程中的a和b,再给出l.r,求l到r的积分的二倍. 输出时要求精度控制为保留到小数点后3位,如下代码中,eps设为1e-9 1e-8时均TLE,1e-4可以AC,1e-3会W ...
- tf.expand_dims和tf.squeeze函数
from http://blog.csdn.net/qq_31780525/article/details/72280284 tf.expand_dims() Function tf.expand_d ...
- matlab中画三维图形
这里主要讲述两个方法用matlab画三维图形: 1.mesh函数 先看一个简单的例子: x = ::; y = ::; [X, Y] = meshgrid(x, y); Z = zeros(,); Z ...
- html address标签 语法
html address标签 语法 作用:定义文档作者/所有者的联系信息. 说明:如果 <address> 元素位于 <body> 元素内部,则它表示该文档作者/所有者的联系信 ...
- UINX标准C - 进程管理
进程与程序的关系: 1.程序就是存储在磁盘上可执行的二进制文件, 2.进程是一个正在执行的的程序,不过一个程序可能存在多个进程实例. 查看进程中的pid和获取pid(进程号) 1.终端指令:ps a ...
- Elastic-Job快速入门
1 Elastic-Job快速入门1.1 环境搭建1.1.1.版本要求JDK要求1.7及以上版本Maven要求3.0.4及以上版本zookeeper要求采用3.4.6及以上版本1.1.2.Zookee ...
- 【bzoj4562】[Haoi2016]食物链
*题目描述: 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动关系,求其中的食物链条数. 物种的名称为从1到n编号 M条能量流动关系形如 a1 b1 a2 b2 a ...
- [CSP-S模拟测试]:简单计算(数学)
题目传送门(内部题104) 输入格式 第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数. 接下来$T$组数据,每组数据一行两 ...
- collection集合整体结构图