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 ...
随机推荐
- STL::allocator rebind
阅读侯捷的STL源码剖析时,发现在allocator类的代码中有这样一个struct template<class T> class allocator { ... template< ...
- HTML5测试(二)
HTML5测试(四) 1.input 元素中,下列哪个类型属性定义了输入电话号码的控件? A.mob B.tel C.mobile D.telephone 答案:B 具有 type 属性的 input ...
- 2018百度之星初赛A轮 度度熊拼三角
#include<bits/stdc++.h> using namespace std; int n; int a[1005]; int main() { int ans; ...
- NOIP2018 D1T3赛道修建
题目链接:Click here Solution: 最小值最大,考虑二分一个答案\(k\) 考虑在子树内先匹配,最后传递一个值给自己的父亲(因为每条边只能用一次,所以一颗子树最多传递一个值) 那么我们 ...
- 搜狗微信采集 —— python爬虫系列一
前言:一觉睡醒,发现原有的搜狗微信爬虫失效了,网上查找一翻发现10月29日搜狗微信改版了,无法通过搜索公众号名字获取对应文章了,不过通过搜索主题获取对应文章还是可以的,问题不大,开搞! 目的:获取搜狗 ...
- (46)LINUX应用编程和网络编程之一Linux应用编程框架
3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. ...
- java web程序上传文件,浏览器显示连接被重置
上传文件时,到13%时浏览器显示连接被重置如图: 参考网上很多方法 比如设置server.xml 的相应大小.时间,然并没有解决问题 connectionTimeout="2000000&q ...
- [CSP-S模拟测试]:优化(贪心+DP)
题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...
- maven使用常见问题
1.我写的是src/main/java/config/mybatis-cofig.xml 但总是报错 Could not find resource src/main/java/config/myba ...
- 打开远程桌面时总提示无法打开连接文件default.rdp
删除C:\Users\Administrator\Documents\default.rdp,再启动远程就好了 http://www.chahushequ.com/read-topic-94-2fa9 ...