C++ auto与循环
C++ auto与循环
C++ auto 的介绍
typeid(p).name();可以输出auto的类型
auto 是 C++11 引入的一个关键字,用于自动类型推导。编译器会根据初始化表达式的类型来自动推导 auto 变量的类型。
使用 auto 可以简化代码,减少重复书写类型名称的繁琐,并且当类型非常复杂或者难以书写时,auto 尤其有用。
以下是 auto 的一些基本用法和注意事项:
- 基本用法:
auto x = 10; // x 是 int 类型
auto y = 3.14; // y 是 double 类型
auto str = "hello"; // str 是 const char[6] 类型
- 复杂类型的推导:
auto func = [](int a, int b) { return a + b; }; // func 是 lambda 表达式类型
- 引用类型的推导:
int a = 10;
auto& ref = a; // ref 是 int& 类型,引用到变量 a
ref = 20; // 修改 ref,a 的值也会被修改
- const 类型的推导:
const auto b = 20; // b 是 const int 类型
- auto 与指针:
auto ptr1 = &a; // ptr1 是 int* 类型
auto ptr2 = new int(30); // ptr2 是 int* 类型
- auto 与模板:
template<typename T>
void print(const T& value) {
auto copy = value; // 这里可以自动推导 copy 的类型
// ... 其他代码
}
- auto 与解构:
std::pair<int, double> p = {1, 3.14};
auto first = p.first; // first 是 int 类型
auto second = p.second; // second 是 double 类型
- auto 与 C++14 的 decltype 推导:
在 C++14 中,你可以使用decltype(auto)来得到更加精确的推导结果。
decltype(auto) f() {
return std::make_pair(1, 3.14); // 返回类型是 std::pair<int, double>
}
注意事项:
- 使用
auto时,初始化表达式必须是有效的,因为编译器需要根据它来推导类型。 auto不能用于函数参数的类型推导,因为函数参数的类型必须在编译时就确定。auto也不能用于类的成员变量的类型推导。
总之,auto 关键字为 C++ 编程提供了更多的灵活性和便利性,特别是在处理复杂类型或模板编程时。
auto在循环中的使用
vector<int> pm;
//传统循环
for(int i=0;i<pm.size();++i)
std::cout<<pm[i]<<'\';
//第一种循环
for(auto v: pm)
std::cout<<v<<'\';
//第二种循环采用引用,速度会更快,避免无意义的拷贝
for(auto& v: pm)
std::cout<<v<<'\';
//第三种循环,为了避免引用的时候不小心修改到数组内容,使用const引用
for(const auto& v: pm)
std::cout<<v<<'\';
上面三种的输出结果都是一样的,而且和传统的相比,速度效率更快。
我们如果想要让自定义容器也实现(auto v:pm)这种效果,我们需要在class中添加这些内容:
class MyVector{
public:
using GroupType = std::vector<int> ;
GroupType::iterator begin(){return m_group.begin();}
GroupType::iterator end(){return m_group.end();}
GroupType m_group;
};
只需要在class中添加一个begin和一个end函数即可。
这下即可使用:
MyVector m;
m.m_group.push_back(1);
m.m_group.push_back(2);
m.m_group.push_back(3);
m.m_group.push_back(4);
for(const auto& v:m)
std::cout<<v<<'\n';
C++ auto与循环的更多相关文章
- construction const parameter问题 构造函数const引用参数问题
工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...
- C++_auto
自动变量,自动获取类型,输出,泛型 自动变量,可以实现自动循环一维数组 自动循环的时候,对应的必须是常量 //auto自动变量,自动匹配类型 #include <iostream> usi ...
- UE4编码规范
翻译原文为Unreal 的官方!自己看着总结了一下,不一定每条都能对上.不足之处,请多多不吝赐教! 原文地址: unreal CodingStandard UE4编码规范 在Epic,有简单几条代码 ...
- C++中数组作为形参进行传递(转)
有两种传递方法,一种是function(int a[]); 另一种是function(int *a) 这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值! 对于第一种,根据之前所学,形参是实 ...
- C++中数组作为形参的方法
转载:https://blog.csdn.net/qq_33374294/article/details/90769668 原链接:https://www.cnblogs.com/abella/p/1 ...
- Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)
参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...
- C++中对C的扩展学习新增语法——For循环以及AUTO类型
For循环以及AUTO类型 For代码实现: AUTO类型: 1.auto自动类型推导,省事. 2.auto主要在模板中用的多,模板的类型比较长,使用auto可以简化代码. 3.不要轻易使用,我们在编 ...
- 基于 range 的 for 循环和 auto
基于 range 的 for 循环和 auto C++11 引入一种循环的新形式,叫基于 range 的 for 循环,它允许我们用更简单易读的形式遍历容器中的所有元素 vector<int&g ...
- C++ 遍历循环表达示 auto, auto&, auto&&
for(auto x : range) 创建拷贝,无法修改range中的元素 for(auto& x : range) 可以修改range中的元素,但一般用以下这种 for(auto& ...
- 模仿Linux内核kfifo实现的循环缓存
想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...
随机推荐
- 手写一个Promise完成resolve 和 reject状态的改变和修改属性
1.手写 Promise 1 创建一个文件 Promise.js:内容 function Promise(){ } 2 引入 Promise.js 这个文件 <script src=" ...
- Windows10磁盘占用100%和内存占用高
前言 公司配备了两台电脑,两台电脑都是安装的win10系统,一台是磁盘占用高,另一台是内存可用低. 具体情况如下: 一台外网机 8g内存,安装win10 专业版,开机一天后经常出现内存不够用,但其实都 ...
- 【一】LaTeX的安装和使用、安装TeXstudio、中文界面输出设置
安装方法一:(推荐) 下载链接·:http://tug.org/texlive/acquire-netinstall.html 下载zip,然后运行Windows批处理脚本(install-tl-wi ...
- (python)学习ing||类学习,@property装饰器
class pers(): def __init__(self,hp): self._hp=hp @property def hp(self): return self._hp @hp.setter ...
- Word-批量导出Word中的图片
当我们需要把Word文件中的图片保存起来,你是如何导出Word图片呢?右键一张张保存图片吗?这效率太低了.如果文档中有大量的图片,这个方法会浪费很多时间. 下面给大家分享word如何批量导出图片的技巧 ...
- Skywalking-Aop Docker单机环境搭建
1.OAP-SERVER和UI环境搭建 本次搭建是基于MySQL进行持久化,因此需要提前准备好一个MySQL容器 (MySQL容器部署略过).如有错误还请指正. 1.1 OAP服务搭建 拉取skywa ...
- 深入读懂 Kafka集群
前言 概述 Kafka是一个多分区.多副本的分布式流处理平台,以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性被广泛使用. 应用场景 (1)缓冲削峰:有利于解决生产消息和消费消息的处理速度不一 ...
- Vmware中Linux通过NAT设置静态IP实现上网
1.设置虚拟机上网方式为NAT 2.修改centos网络配置文件,我的是centos7.4,主要网关不能和主机设置的一致 [root@dylan-centos ~]# vi /etc/sysconfi ...
- win32- GetMessage的使用
BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle th ...
- golang常用库:gorilla/mux-http路由库使用
golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库/管理工具-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:gola ...