C++ auto与循环

C++ auto 的介绍

typeid(p).name();可以输出auto的类型

auto 是 C++11 引入的一个关键字,用于自动类型推导。编译器会根据初始化表达式的类型来自动推导 auto 变量的类型。

使用 auto 可以简化代码,减少重复书写类型名称的繁琐,并且当类型非常复杂或者难以书写时,auto 尤其有用。

以下是 auto 的一些基本用法和注意事项:

  1. 基本用法
auto x = 10;         // x 是 int 类型
auto y = 3.14; // y 是 double 类型
auto str = "hello"; // str 是 const char[6] 类型
  1. 复杂类型的推导
auto func = [](int a, int b) { return a + b; };  // func 是 lambda 表达式类型
  1. 引用类型的推导
int a = 10;
auto& ref = a; // ref 是 int& 类型,引用到变量 a
ref = 20; // 修改 ref,a 的值也会被修改
  1. const 类型的推导
const auto b = 20;  // b 是 const int 类型
  1. auto 与指针
auto ptr1 = &a;     // ptr1 是 int* 类型
auto ptr2 = new int(30); // ptr2 是 int* 类型
  1. auto 与模板
template<typename T>
void print(const T& value) {
auto copy = value; // 这里可以自动推导 copy 的类型
// ... 其他代码
}
  1. auto 与解构
std::pair<int, double> p = {1, 3.14};
auto first = p.first; // first 是 int 类型
auto second = p.second; // second 是 double 类型
  1. 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与循环的更多相关文章

  1. construction const parameter问题 构造函数const引用参数问题

    工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...

  2. C++_auto

    自动变量,自动获取类型,输出,泛型 自动变量,可以实现自动循环一维数组 自动循环的时候,对应的必须是常量 //auto自动变量,自动匹配类型 #include <iostream> usi ...

  3. UE4编码规范

    翻译原文为Unreal 的官方!自己看着总结了一下,不一定每条都能对上.不足之处,请多多不吝赐教! 原文地址:  unreal CodingStandard UE4编码规范 在Epic,有简单几条代码 ...

  4. C++中数组作为形参进行传递(转)

    有两种传递方法,一种是function(int a[]); 另一种是function(int *a) 这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值! 对于第一种,根据之前所学,形参是实 ...

  5. C++中数组作为形参的方法

    转载:https://blog.csdn.net/qq_33374294/article/details/90769668 原链接:https://www.cnblogs.com/abella/p/1 ...

  6. Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)

    参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...

  7. C++中对C的扩展学习新增语法——For循环以及AUTO类型

    For循环以及AUTO类型 For代码实现: AUTO类型: 1.auto自动类型推导,省事. 2.auto主要在模板中用的多,模板的类型比较长,使用auto可以简化代码. 3.不要轻易使用,我们在编 ...

  8. 基于 range 的 for 循环和 auto

    基于 range 的 for 循环和 auto C++11 引入一种循环的新形式,叫基于 range 的 for 循环,它允许我们用更简单易读的形式遍历容器中的所有元素 vector<int&g ...

  9. C++ 遍历循环表达示 auto, auto&, auto&&

    for(auto x : range) 创建拷贝,无法修改range中的元素 for(auto& x : range) 可以修改range中的元素,但一般用以下这种 for(auto& ...

  10. 模仿Linux内核kfifo实现的循环缓存

    想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...

随机推荐

  1. 使用css 与 js 两种方式实现导航栏吸顶效果

    场景描述 简单的说一下场景描述:这个页面有三个部分组成的. 顶部的头部信息--导航栏--内容 当页面滚动的时候.导航栏始终是固定在最顶部的. 我们使用的第一种方案就是使用css的粘性定位 positi ...

  2. kettle系统列文章03---如何建立一个作业

    上篇文章我们建立好了转换,我们希望这个转换可以做成定时任务,每一分钟执行一次 第一步:创建作业开始节点:文件---->新建---->作业----核心对象---->通用-----> ...

  3. 驱动开发:WinDBG 枚举SSDT以及SSSDT地址

    在前面的博文<驱动开发:内核读取SSDT表基址>中已经教大家如何寻找SSDT表基地址了,今天给大家分享两个适用于WinDBG调试器上的脚本文件,该脚本文件可以很好的枚举出当前系统内的SSD ...

  4. 使用CAShapeLayer,UIBezierPath,CAGradientLayer构建边框颜色会旋转的六边形

    主要思路是: 1.使用UIBezierPath绘制一个六边形路径 2.创建一个CAShapeLayer图层,将这个六边形path设置到CAShapeLayer属性上.然后设置fillColor为透明, ...

  5. Docker从认识到实践再到底层原理(五)|Docker镜像

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  6. 教你用JavaScript实现粘性导航

    案例介绍 欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个粘性导航.移动页面导航仍在页面上方.通过实战我们将学会scrollY属性.offse ...

  7. Linux-grep或和与操作

    一.或(or)操作1.使用选项 -Egrep -E 'a1|a2'filename // 找出文件(filename)中包含a1或者包含a2的行 2.使用egrepegrep 'a1|a2' file ...

  8. python高级用法之命名元组namedtuple

    1.tuple类型数据的获取 大家都知道,元组里面的数据获取只能通过下标的方式去获取,比如 :a = ('username', 'age', 'phone'),要获取username的话 ,就需要用a ...

  9. Power BI 10 DAY

    Power BI 上下文 筛选上下文只管筛选,行上下文只管迭代,两者互不干涉,各司其职 计算列操作会自动创建行上下文 度量值不会自动创建行上下文,需要人为使用迭代函数进行行上下文的创建 (迭代函数本身 ...

  10. JS leetcode 回文数 题解分析,数学不好是硬伤

    壹 ❀ 引 每日一题环节,今天的一道是让我相信自己数学薄弱的题目,题目来源leetcode9. 回文数,题目描述如下: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样 ...