【C++】auto

auto 的作用

作用:自动类型推导,编译器根据初始化表达式自动推断变量类型,像一些需要类中的迭代器等都可以自动适配类型。

旧 C 语言里auto是「自动存储期」关键字,C++11 起被重新定义成类型占位符。

cpp 复制代码
auto a = 10;        // int
auto b = 3.14;      // double
auto str = "hi";    // const char*
string s = "abc"; // std::string
auto ch = s.begin();

代码对比:

cpp 复制代码
string s = "abc"; // std::string
std::string::iterator it = s.begin();
auto it = s.begin();

重要规则

  1. 必须初始化 ,不能写 auto a;,没有初始值无法推导

  2. 一条声明多个变量,推导出来类型必须相同,否则编译报错

  3. auto会默认丢弃顶层 const

    cpp 复制代码
    const int m = 5;
    auto n = m; // n 是 int,不是 const int
  4. 推导规则等价于模板实参推导

for 的循环用法

cpp 复制代码
vector<int> v{1,2,3};
for(auto val : v){
    cout << val;
}

auto 会对内容进行依次打印出来,原理就是 auto 会调用类里面对应的 begin() 和 end () 迭代器,进行确定为位置,如果类中没有begin 和end 会出现编译错误的情况。

auto 的 const 和 const &

auto 只自动匹配基础类型,不会自动给变量加上引用,也不会默认保留变量的顶层 const;想要引用、只读 const 效果,需要我们自己在 auto 旁边写 & /const。

带引用、const 修饰

cpp 复制代码
int x = 100;
auto &r = x;         // int& 引用
const auto &cr = x;  // const int&
auto *p = &x;        // int*

string 的 auto 的运用

cpp 复制代码
string s = "hello";

// auto:拷贝char,副本修改不影响原字符串
for(auto ch : s)
{
    ch = 'x';
}
cout << s << endl; // hello,原串没变

// auto&:引用字符,可以修改原字符串
for(auto& ch : s)
{
    ch = 'x';
}
cout << s << endl; // xxxxx

// const auto& 只读遍历
const string s2 = "test";
for(const auto& ch : s2)
{
    cout << ch;
}

**注意:**像这种比较大型的类,单纯用auto 会加大拷贝开销,导致运行代码内存时间上的负担,最好能用应用就应用,只读不写的就多加上 const 。

  1. 基础小类型(int、char) auto 拷贝代价很低,写起来简单,只读遍历可以直接 auto;
  2. 大对象(string、自定义类)
  • ✅只读优先:const auto& 避免拷贝
  • 性能最优 ✅需要修改容器元素:auto&
  • ❌不推荐单纯auto,会复制一份大对象,产生额外开销

易错点

cpp 复制代码
vector<string> vec{"A","B"};
for(auto& x : vec){
    x = "new"; // ✅正常修改容器元素
}

const vector<string> cv{"1","2"};
// for(auto& x : cv) {} // ❌报错,普通引用不能绑定const容器的元素
// 出现一个权限放大的情况
for(const auto& x : cv){} // ✅必须const auto&
相关推荐
moshuying3 分钟前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
kyriewen5 分钟前
我算了笔账:AI 编程工具一年烧掉两台 MacBook
前端·人工智能·程序员
xyouyuweizhu26 分钟前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟37 分钟前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
moshuying1 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记1 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
多弗朗皮卡丘1 小时前
C++的IO流
开发语言·c++·io流·文件io流
qq_401700411 小时前
100 个 IoT 小项目,给 ESP32 入门补上实操
前端·网络·stm32
liyi_hz20081 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3271 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph