C++0X 学习之 auto
auto并不是一个新关键词,是一个把旧关键词赋予新的作用,
新的作用修饰变量声明,指示编译器根据变量的初始化表达式推导变量应有的类型。
auto 声明的变量必须“在声明处完成初始化”,编译器才可根据初始化表达式推导变量的类型。
二话不说,先看看例子呗。
对于现在,我们一般通过迭代器 for 容器的时候,都会写出这样的代码
#include <map>
#include <string>
struct people
{
int age;
char sex;
}; typedef std::map<std::string,people> people_map; int _tmain(int argc, _TCHAR* argv[])
{
people_map my_map;
for (people_map::iterator it = my_map.begin(); it != my_map.end(); ++it)
{
std::cout<<"do something"<<std::endl;
} return ;
}
获取容器的迭代器之前,我们要写出容器的类型,在这里用了 typedef,把类型缩短了=,=,
要是懒点的话,很可能写成 std::map<std::string, people>::iterator。我的天啊,
我仅仅想获取它的迭代器,却要写那么多代码。很多时候,我们并不需要知道容器的类型,
或者,我们已经非常清楚类型了,那么,除了用 typedef 简化,还有啥方法呢?
这就是 auto 关键词的新作用了,用来推倒表达式的应有类型,代码改进后是这样子了。
#include <map>
#include <string> struct people
{
int age;
char sex;
}; int main()
{
std::map<std::string, people> my_map;
for (auto it= my_map.begin(); it!=my_map.end(); ++it)
{
std::cout<<"do something"<<std::endl;
}
return ;
}
在这里,把 typedef 咔嚓掉了(但是声明变量的时候麻烦了点)=,=,然后获取迭代器, 直接用 auto 了,不用管它是什么类型了。 在这里,it 自动推导成 std::map<std::string, people>::iterator 了。
auto 是不是很强大的一个关键词呢,在新的作用下,可以写出更简洁的代码。 但是 auto 也有局限性,比如上面的例子,他是推导成 std::map<std::string, people>::iterator, 不会推导成 std::map<std::string, people>::const_iterator。
使用 auto关键词也有注意的地方(摘自网络):
注意一:auto 不能做为模板参数。因为这违背了 auto 需要由初始化表达式来推导类型的原则。
注意二:auto 不能做为函数的参数类型和返回类型。同样是因为违背了 auto 推导类型的原则。 函数在编译时要实例化,此时便需要确定参数的类型,以方便安排内存。声明为 auto 的话如何确定其类型呢?没法确定,所以这样用是不允许的。
下面再让我门看看 auto 的一点代码 然后 就可以睡觉了:
#include <iostream>
#include <vector>
using namespace std; int main()
{
auto a = ;
cout<<a<<endl; // auto b = 12.0f;
cout<<b<<endl; // auto& c = a;
c++;
cout<<a<<endl; // vector<int> vec;
for(int i = ; i < ; ++i)
{
vec.push_back(i);
}
for (auto it = vec.cbegin(); it != vec.cend(); ++it)
{
cout<<*it<<endl; // 0 1 2 3 4 5 6 7 8 9
} //lambda 表达式
auto pF = [&c](int i)->int{ return c+=i; };
cout<<pF()<<endl; // cout<<a<<endl; // return ;
}
好吧 同志们 每天学习一点点 洗洗睡吧!!!
最新文章
- C#语法糖大汇总
- C#操作IIS程序池及站点的创建配置
- CRC16校验码生成
- C# + winserver2008 openfiledialog 写入 textbox1 中的 路径不正确
- 时序图 Sequence Diagram
- 17_高级映射:一对一查询(使用resultType)
- jquery1.9学习笔记 之层级选择器(三)
- zoj2059(经典dp)
- 解决 spring mvc 3.+ 结合 hibernate3.+ 使用<;tx:annotation-driven>;声明式事务无法提交的问题
- FNDCPASS Troubleshooting Guide For Login and Changing Applications Passwords
- keras 入门整理 如何shuffle,如何使用fit_generator 整理合集
- CTR常见规则摘录
- 细说shiro之六:session管理
- Delphi调用SQL分页存储过程实例
- Vue + Element UI 实现权限管理系统 前端篇(十五):嵌套外部网页
- html5 选择多张图片在页面内预览并上传到后台
- Yii2给数据库表添加字段后对应模型无法识别到该属性的原因和解决办法
- HTTP响应状态码 含义
- 深入浅出Spark的Checkpoint机制
- EEPLAT学习