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. Vue双向数据绑定原理-下

    Vue双向数据绑定原理-下这一篇文章主要讲解Vue双向数据绑定的原理,主要是通过Object.defineProperty()来实现的,这里我们手写Vue双向数据绑定的原理. 首先我提出一个需求,我的 ...

  2. el-tree只展示前三个节点数据

    后端也返回了第四等级,但是不想让他展示,可以这样解决只展示前三等级 // 获取room树 getRoomTreeList() { getRoomTree().then((res) => { // ...

  3. 基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回

    基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回 语义索引(可通俗理解为向量索引)技术是搜索引擎.推荐系统.广告系统在召回阶段的核心技术之一.语义索引模型的 ...

  4. Github最简单上传教程:真正的两分钟就可以学会! guitar

    相关链接: 码云(gitee)配置SSH密钥 码云gitee创建仓库并用git上传文件 git 上传错误This oplation equires one of the flowi vrsionsot ...

  5. python随机种子seed的作用(强化学习常用到)

    先上代码 import math import gym from gym import spaces, logger from gym.utils import seeding import nump ...

  6. 创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

      本文介绍基于C++语言GDAL库,批量创建大量栅格遥感影像文件,并将数据批量写入其中的方法.   首先,我们来明确一下本文所需实现的需求.已知我们对大量遥感影像进行了批量读取与数据处理操作--具体 ...

  7. springboot log 没落盘

    在配置文件中增加了下面的配置并不起作用. logging.file=/xx/xx.log 是因为在 springboot 2.2 版本之后上面的采纳数已经被废弃,需要用下面新的参数: logging. ...

  8. delphi的bpl、dcp 、dcu

    BPL  英文全称 Borland Package library ,是一种特殊的DLL文件,用于代码重用和减少可执行文件.编译bpl时,仅需要添加相应功能的pas文件,如果有窗体,则需要添加dfm文 ...

  9. 《ASP.NET Core 微服务实战》-- 读书笔记(第12章)

    第 12 章 设计汇总 微服务开发并不是要学习 C#.Java 或者 Go 编程--而是要学习如何开发应用以适应并充分利用弹性伸缩环境的优势,它们对托管环境没有偏好,并能瞬间启停 换句话说,我们要学习 ...

  10. 中国特色AI创业:在OpenAI阴影下的探索与挑战

    在中国特色背景下,AI创业领域的一些荒诞现象以及对AI创业者.投资人的心态和影响.同时,OpenAI的强大影响力和国内AI领域的创业现状. 首先,小红书上关于中国版Sora项目的荒诞段子,揭示了部分人 ...