C++之auto 关键字

1. auto 是什么?

一句话:
让编译器帮你看一眼"右边是什么类型",然后自动把变量声明成那个类型。

cpp 复制代码
auto x = 42;        // 右边是 int 字面量 -> x 的类型就是 int
auto y = 3.14;      // 右边是 double 字面量 -> y 就是 double
auto z = "hello";   // 右边是 const char* -> z 就是 const char*

写起来像动态语言(Python/JavaScript),但编译期就确定了具体类型,所以不会损失性能。


2. 基本语法

语法模板:

arduino 复制代码
auto 变量名 = 初始值;     // 必须有初始值,否则编译器没法推断

注意:

  • 不能写成 auto x; ------ 会报错!
  • 可以加上 const&* 等修饰符,写法如下:
cpp 复制代码
const auto  a = 10;          // const int
auto&       b = a;           // 引用,类型是 const int&
auto*       p = &a;          // 指针,类型是 const int*

3. 常见场景逐个击破

3.1 迭代器------最常用

传统写法又长又臭:

cpp 复制代码
std::map<std::string, std::vector<int>> m;
// 传统写法
for (std::map<std::string, std::vector<int>>::iterator it = m.begin();
     it != m.end(); ++it) { ... }

auto 写法:

cpp 复制代码
for (auto it = m.begin(); it != m.end(); ++it) { ... }

再升级(C++11 range-for):

cpp 复制代码
for (const auto& kv : m) {
    // kv.first  -> std::string
    // kv.second -> std::vector<int>
}

3.2 返回值类型很长

cpp 复制代码
std::shared_ptr<std::unordered_map<int, std::string>>
createTable();   // 返回类型巨长

auto table = createTable();   // 一行搞定

3.3 泛型代码 / 模板

cpp 复制代码
template<typename Container>
void printFirst(const Container& c) {
    auto it = c.begin();   // 不用关心 Container 是什么
    if (it != c.end())
        std::cout << *it;
}

4. 容易被坑的 3 个细节

4.1 忘记引用导致拷贝

cpp 复制代码
std::vector<int> v = {1,2,3};
for (auto x : v)  x *= 2;        // 改的是拷贝,原 vector 不变
for (auto& x : v) x *= 2;        // OK,改的是原数据

4.2 类型推断与"顶层 const"被丢弃

cpp 复制代码
const int ci = 100;
auto a = ci;   // a 是 int,顶层 const 被丢掉
auto& b = ci;  // b 是 const int&,保留底层 const

4.3 auto 不能用来推导数组

cpp 复制代码
int arr[5];
auto a = arr;   // a 退化成 int*,不是 int[5]

5. C++14/C++17 加强补充(了解即可)

  • 返回值自动推导(C++14)

    cpp 复制代码
    auto add(int x, int y) { return x + y; }  // 编译器自己看 return 语句
  • 泛型 lambda(C++14)

    cpp 复制代码
    auto lambda = [](auto x, auto y) { return x + y; };
  • 结构化绑定(C++17)

    cpp 复制代码
    std::map<int, std::string> mp;
    for (const auto& [key, val] : mp) { ... }   // 直接解包 key 和 val

6. 一张思维导图(文字版)

arduino 复制代码
auto
├─ 基本:auto x = 初始值;
├─ 修饰:const auto&, auto*, ...
├─ 场景
│  ├─ 迭代器
│  ├─ 返回值
│  ├─ 模板 / 泛型
│  └─ lambda
└─ 坑
   ├─ 忘引用
   ├─ const 被丢
   └─ 数组退化

7. 小结口诀(背下来)

"右边是啥我就啥,必须初始化;引用加 &,只读加 const,别忘范围 for 用 &!"

相关推荐
W23035765736 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
.Ashy.6 小时前
2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记
c语言·c++·蓝桥杯
minji...7 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
CoderCodingNo9 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
hetao173383710 小时前
2026-04-09~12 hetao1733837 的刷题记录
c++·算法
6Hzlia10 小时前
【Hot 100 刷题计划】 LeetCode 136. 只出现一次的数字 | C++ 哈希表&异或基础解法
c++·算法·leetcode
汉克老师11 小时前
GESP2024年6月认证C++三级( 第二部分判断题(1-10))
c++·数组·位运算·补码·gesp三级·gesp3级
无限进步_12 小时前
【C++】只出现一次的数字 II:位运算的三种解法深度解析
数据结构·c++·ide·windows·git·算法·leetcode
小贾要学习12 小时前
【Linux】TCP网络通信编程
linux·服务器·网络·c++·网络协议·tcp/ip
哎嗨人生公众号13 小时前
手写求导公式,让轨迹优化性能飞升,150ms变成9ms
开发语言·c++·算法·机器人·自动驾驶