【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 不会影响原来的数据
相关推荐
青少儿编程课堂11 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven11 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_4069810311 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus1 天前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla1 天前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu1 天前
一个通用游戏数据服务器
c++·架构
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck1 天前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀1 天前
背包DP(01背包+完全背包)
c++·算法