auto与迭代器的用法_C++关键字之auto、decltype

8f9629d66080393d2a6d830695f86732.png

​概念介绍

auto、decltype是C++11新增特性,主要是用来做类型推导。这个特性是C++11新增特性,但是这个功能,C++编译器之前就具备,只是未对开发者开放使用。

通过这个例子可以证明:

string str;
int i = str;

vs编译的时候报错信息:

2127ee0c9b7ba1d0473683a42b32dfb2.png

通过这个报错信息,可以说明,编译器在编译的时候,是能够推断出变量的类型的,不然通过 int i = str这一行代码是不能推断出类型不匹配的。

由此可见,类型推导的功能,C++11之前就有。那为什么C++11之后开放出来了,那是因为:好用。是真的好用,希望大家以后多实践,越用越能够体会这个特性带来的便捷。

auto的用法

例子1: 使用迭代器遍历容器

C++11之前的写法:

vector<int> vec;
//do something
for(vector<int>::iterator itor=vec.begin();itor!=vec.end();itor++){
    cout<<(*itor)<<endl;
    //do something
}

使用auto:

vector<int> vec;
//do something
for(auto data : vec){
    cout<<data<<endl;
    //do something
}

上述写法中,auto data : vec这样是对vec的元素进行拷贝,这样操作,当容器里面的元素较多,操作比较频繁时,会降低程序的运行效率,而且,如果需要修改vec的元素,这样遍历容器去修改也是不能修改容器本身的,只能修改拷贝的备份,失去了修改的意义。

所以,

如果需要修改容器的元素,建议这样写:

for (auto& data : vec){
    cout<<data<<endl;
    //do something
}

如果不需要修改容器的元素,建议这样写:

for (const auto& data : vec){
    cout<<data<<endl;
    //do something
}

这两种是通过引用的方式,避免遍历的时候需要去拷贝元素。如果不需要修改容器的元素,可以加上const,防止误操作。

例子2: 方便扩展、修改

int a;
//do something
auto b = a;
//do something
auto c= a++;

如果有一天,需要把a的类型换成long, 那么直接将int a;改成 long a;即可。

auto注意事项

1,不能这样写:

auto i;

2,可以在一条语句声明多个变量,但这多个变量只能是同一个基本数据类型

auto a = 0, *p = &a;  //正确
auto b = 0, f = 5.01; //错误

decltype的用法

例子1: 使用变量的类型来定义一个新的变量

int i = 1;
decltype(i) a = 0;

例子2: 使用函数的返回值的类型来定义一个新的变量

如下,如果我们知道函数的返回值是一个指针,我们不需要知道具体是什么类型的指针,就可以定义一个变量接收函数的返回值:

decltype(f()) a = f();

注意:这里的decltype(f())是不会执行函数f(),只推导函数的返回类型。

auto、decltype的区别

auto会忽略变量顶层的const、&属性,也就是说,一个变量如果是const int类型的,那么,如果用auto推导之后获取的变量类型则会是int。同样,&(引用)属性也会被忽略,如,int &,用auto推导之后就会变成int类型,但decltype不会这样:

const int ci = 42, &cj = ci;
decltype(ci) x = 0; //变量x的类型是const int
auto z = ci;      //变量z的类型是int
decltype (cj) y = x; //变量y的类型是const int&
auto w = cj;     //变量w的类型是int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值