【C++】String

auto 关键字


auto核心规则

  • auto:编译期自动推导变量类型,必须有初始值

  • C++11:改成类型推导关键字,不再代表存储类型

  • 指针 & 引用推导
    (1)auto y = &x; 和 auto* z = &x; 效果一样,都是指针
    (2)引用必须手动写 &:auto& m = x;,只写 auto 不会推导成引用

  • 同一行多个变量:推导出来类型必须全部相同

    复制代码
    auto aa = 1, bb = 2;   //  都是int
    auto cc = 3, dd = 4.0; //  报错:一个int一个double,类型不一致
  • 重点
    (1) 不能没有初始化:auto e; 直接报错,没有值没法推导
    (2) 不能直接用来定义数组:auto array[] = {4,5,6}; 报错
    (3)C++11/14 不能做函数形参(C++20 支持 auto 参数)
    (4)可以做函数返回值,但可读性变差,谨慎使用

  • 经典使用场景:简化迭代器

    复制代码
    map<string,string> dict = {{"apple","苹果"},{"orange","橙子"}};
    // 原来很长的迭代器类型
    // map<string,string>::iterator it = dict.begin();
    auto it = dict.begin(); // auto自动推导出迭代器类型,简化代码
  • 补充:typeid(变量).name() 用来查看推导出来的类型名


代码
  • auto 推导普通变量

    复制代码
    	int a = 10;
    	auto b = a;
    	auto c = 'a';
    	
    	cout << typeid(b).name() << endl; //  int
    	cout << typeid(c).name() << endl;  // char
  • auto 接收函数返回值

    复制代码
    int func1()
    {
    	return 10;
    }
    
    int main()
    {
    
    	auto d = func1();
    	cout << typeid(d).name() << endl;  // int
    	return 0;
    }
  • auto 推导指针和引用

    复制代码
    	int x = 10;
    	auto y = &x; // auto 推导成 int*
    	auto* z = &x;  // auto 推导成 int  ,整体 z:int*
    	auto& m = x;  //auto 推导成 int, m是int 的引用
    	cout << typeid(y).name() << endl;  // int*
    	cout << typeid(z).name() << endl;  //int *
    	cout << typeid(m).name() <<endl;  // int

    重点:typeid 看不到引用属性,m 本质是引用,

    但 typeid 识别出来是 int,这个是 typeid 本身的特性,记住这个坑

  • 同一行定义多个 auto 变量,类型必须相同

    复制代码
    	auto aa = 1, bb = 2;
    	cout << typeid(aa).name() << endl; // int
    	cout << typeid(bb).name() << endl;  // int

    知识点:auto 在一行声明多个变量,编译器只用第一个初始值推导类型,

    后面变量必须和它类型一致

  • auto 用作函数返回值

    复制代码
    // auto 作为返回值
    auto func3()
    {
    	return 3;
    }
    
    int main()
    {
    	auto ret = func3();
    	cout << typeid(ret).name() << endl; //int
    
    	return 0; 
    }

    知识点: C++11 支持 auto 作为函数返回类型,

    编译器根据 return 后面的值推导返回类型;

  • auto 简化 map 迭代器

    复制代码
    	map<string, string> dict = { {"apple","苹果"},{"orange","橙子"},{"pear","梨"} };
    
    	// map<string,string>::iterator it=dict.begin();
    
    	auto it = dict.begin();
    	while (it != dict.end())
    	{
    		cout << it->first << " : " << it->second<<endl;
    		it++;
    	}

    重点:这里 auto 自动帮我们推导出很长的迭代器类型,是 auto 最常用的场景之一



范围 for


核心
  • C++11 新增范围 for(range-based for),

    用来简化数组、容器(string、vector、map 等)的遍历

复制代码
  for( 迭代变量 : 被遍历的范围 )
  {
      //循环体
  }
  • : 冒号把语句分成两部分:
    前面:迭代变量;
    后面:要遍历的集合 / 数组 / 容器;
  • 自动遍历、自动取元素、自动判断结束,不用写下标、不用算长度;
  • 底层:编译器会自动转成迭代器实现(容器),数组会自动识别范围。
  • 重点区分 auto &e 和 auto e
    (1)auto &e:引用 ,操作的是数组 / 容器里原元素 ,可以修改原值
    (2)auto e:值拷贝,拿到的是元素副本,修改 e 不会影响原来的数据
相关推荐
会编程的小孩10 小时前
C++ qt的安装
c++
小成2023032026515 小时前
C++~07补充
开发语言·c++
hold?fish:palm16 小时前
40 二叉树的直径
c++·leetcode
解决小子16 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
lunar_coder17 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯18 小时前
C++进阶.多态
c++
凯瑟琳.奥古斯特19 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun6119 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖20 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节