首页 > 编程语言 >C++ auto与循环

C++ auto与循环

时间:2024-02-25 22:22:39浏览次数:28  
标签:group 推导 int auto C++ 循环 类型

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';

标签:group,推导,int,auto,C++,循环,类型
From: https://www.cnblogs.com/AndreaDO/p/18033172

相关文章

  • C++U6-05 - 动态规划算法入门
    目标:动态规划     兔子数列的每一项都是前两项之和,公式为f[n]=f[n−1]+f[n−2]。#include<bits/stdc++.h>usingnamespacestd;intmain(){intf[105],n;f[1]=1;f[2]=1;cin>>n;for(inti=3;i<=n;i++){......
  • C++U5-第05课-广度优先搜索2
    学习目标 广度优先搜索的思路复习 [【广度优先搜索(二)】图像渲染]  【题意分析】从需要上色的点开始,将所有与他相连接的点全部涂上相同的颜色【思路分析】我们从给定的起点开始,进行广度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该......
  • C++文件读取末尾空行问题
    起因是做gitlet读取文件内容时遇到的内容不匹配错误,后来发现是自己读取文件内容时均使用getline函数,写回时读入的每个字符串都加上换行符,导致文件末尾可能多出换行符。于是改成了vector<string>Blob::readContentsForBlob(conststring&file){vector<string>content;......
  • 为什么 Hooks,千万不要在 if 语句或者 for 循环语句中使用!
    如果组件中多次使用useState怎么办?React如何“记住”哪个状态对应哪个变量?React是完全根据useState的调用顺序来“记住”状态归属的,假设组件代码如下:constCounter=()=>{const[count,setCount]=useState(0);const[foo,updateFoo]=useState('foo');......
  • Net8 Autofac实现依赖注入(构造函数注入、属性注入)
    项目以net8建立为例子(net6也通用),使用Autofac实现构造函数注入、属性注入两种。引用以下packageAutofacAutofac.Extensions.DependencyInjectionMicrosoft.Extensions.DependencyModel在program下添加autofacbuilder.Host.UseServiceProviderFactory(newAutofacServicePr......
  • java中要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
    初学java实现简易计算器**思路推荐:*写4个方法:加减乘除*利用循环+switch进行用户交互*传递需要操作的两个数*输出结果点击查看代码publicclassdemo05{publicstaticvoidmain(String[]args)throwsInterruptedException......
  • 3. 无重复字符的最长子串C++
    思路就是从头开始找,然后每次在从重复节点的后一个找。classSolution{public:intlengthOfLongestSubstring(strings){inti=0,j=0,nowmax=1;intmax=1;if(s.size()==0||s.size()==1)returns.size();map<char,int>m;......
  • C++ STL学习
    C++STL学习目录C++STL学习容器库概览对可以保存在容器中的元素的限制容器支持的操作所有容器都支持的操作或容器成员迭代器迭代器的公共操作迭代器的类型迭代器的const属性迭代器的操作类型迭代器范围使用左闭合区间的编程假定顺序容器顺序容器概述顺序容器的类型和特点确定使......
  • C++ 拷贝构造函数简单测试
    浅拷贝静态数组的空间体现深拷贝的效果#include<iostream>#include<string>usingnamespacestd;#defineSEX_SIZE10classStudent{public:Student(stringname){Age=10;Name=newstring(name);strcpy(Sex,"男");......
  • SciTech-Mathmatics-automatic equation Numbering / \tag{E} / \label{E} / \ref{
    https://discourse.devontechnologies.com/t/numbering-and-tagging-equations-in-mathjax/69524/2IwentaroundincirclestryingtofigureouthowtonumberandtagequationsinMathJaxinDT3.TheMathJaxDocsshowshowtodoautomaticequationnumbering21......