auto在现代C++中的正确用法,你真的掌握了吗?

C++中auto的作用 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、C++中auto的用法:二、使用步骤1.引入库2.读入数据总结 前言 1.本人编程萌新一枚,这个号是自学C++及其它有关知识的一些心得体会,欢迎友友们评论区或私信批评指正哈。 2.编程环境:Linux Distributor ID: Debian Description: Debian GNU/Linux 10 vim搭配gGCC/G++ 一、C++中auto的用法: auto是根据后面的值来推测前面的变量类型是什么,其主 阅读详情

第一章:auto 的类型推导规则

在 C++11 及后续标准中,auto 关键字被赋予了全新的语义——自动类型推导。编译器会根据初始化表达式自动推断变量的类型,从而简化代码书写并提高可读性。

基本类型推导机制

auto 的类型推导遵循与模板参数类似的规则。声明时必须提供初始化表达式,否则编译器无法推导类型。

auto x = 42;        // 推导为 int
auto y = 3.14;      // 推导为 double
auto z = "hello";   // 推导为 const char*
上述代码中,编译器根据右侧初始化值的类型决定 x、 和 的实际类型。

引用与 const 的处理

当使用 auto 推导时,顶层 const 和引用会被忽略。若需保留,必须显式声明。
  • auto var = expr;:忽略顶层 const 和引用
  • auto& var = expr;:推导为引用,保留底层 const
  • const auto var = expr;:定义为 const 变量
例如:

const int ci = 10;
auto b = ci;      // b 是 int(const 被丢弃)
auto& c = ci;     // c 是 const int&

常见推导场景对比

初始化表达式auto 推导结果说明
int i = 42; auto a = i;int值拷贝,不保留 const
auto& r = i;int&引用绑定,保留原始类型特性
auto* p = &i;int*指针类型正确推导

第二章:auto 在变量声明中的应用

2.1 auto 与复合类型的推导陷阱

在 C++ 中,auto 关键字虽简化了变量声明,但在涉及复合类型时易引发推导偏差。尤其当表达式包含引用、指针或顶层 const 时,auto 可能未按预期推导。
引用与顶层 const 的丢失
const int ci = 42;
auto var = ci;        // var 是 int,顶层 const 被忽略
auto& ref = ci;       // ref 是 const int&,必须显式保留 const
上述代码中,var 推导为 int,原始的 const 属性被丢弃。若需保留,必须显式声明为 const auto。
指针与复合类型的误判
  • auto 在推导时将 * 视为类型修饰符,而非解引用操作
  • 使用 & 声明引用时,必须确保右侧表达式产生左值
正确理解 auto 的推导规则,尤其是与 const、引用和指针结合时的行为,是避免类型错误的关键。

2.2 const 和引用环境下 auto 的行为分析

在 C++ 中,`auto` 关键字的类型推导遵循与模板参数类似的规则,尤其在涉及 `const` 和引用时表现尤为敏感。
const 环境下的 auto 推导
当初始化表达式为 `const` 类型时,`auto` 会保留顶层 `const` 属性:
const int ci = 10;
auto x = ci;  // x 的类型是 int(顶层 const 被忽略)
auto& y = ci; // y 的类型是 const int&
此处 `x` 推导为 `int`,因为赋值操作不保留顶层 `const`;而 `y` 显式声明为引用,因此必须包含 `const`。
引用与 auto 的交互
使用 `auto&` 可以精确捕获左值引用,并保留 `const` 属性:
  • 若初始化对象为 `const`,则 `auto&` 推导出 `const&`
  • 非引用声明会复制值,丢弃 `const` 和引用属性

2.3 初始化列表中 auto 的类型确定机制

当使用 auto 与初始化列表结合时,编译器依据初始化表达式的类型推导变量类型。对于花括号初始化列表,若列表为空,auto 无法推导类型,将导致编译错误。
类型推导规则
  • 非空初始化列表:auto 推导为 std::initializer_list
  • 元素类型不一致时:若无法统一为同一类型,推导失败
  • 空列表:如 auto x{};,推导为未知类型,编译报错
auto a = {1, 2, 3};           // 推导为 std::initializer_list<int>
auto b = {1, 2.5, 3};         // 错误:int 与 double 无法统一
auto c{};                     // 错误:空列表无法推导
上述代码中,a 成功推导是因为所有元素均为整型,形成 std::initializer_list<int>;而 b 因类型冲突失败;c 则因无元素可供推导而报错。

2.4 使用 auto 提升代码可读性的实践案例

在现代C++开发中,auto关键字不仅能减少冗长的类型声明,还能显著提升代码的可读性与维护性。
简化迭代器声明

std::map> data;
for (const auto& [key, values] : data) {
    std::cout << key << ": ";
    for (const auto& val : values) {
        std::cout << val << " ";
    }
    std::cout << "\n";
}
上述代码利用auto结合结构化绑定,避免了冗长的迭代器类型声明。第一层循环中,auto& [key, values]自动推导键值对类型,第二层则简化容器遍历,使逻辑更清晰。
提高泛型代码表达力
  • 在模板编程中,返回类型复杂时auto可隐藏繁琐的类型细节
  • 配合lambda表达式,使函数对象的使用更自然

2.5 避免过度使用 auto 导致的维护难题

在现代C++开发中,auto关键字极大提升了代码简洁性,但滥用可能导致类型推导不透明,增加维护成本。
可读性下降的风险
当函数返回复杂类型时,过度依赖auto会使调用者难以判断实际类型,尤其在链式调用中:
auto result = process(data); // 返回 std::optional<std::vector<std::shared_ptr<Node>>>?
上述代码未明确类型,后续操作易引发误解,调试时需深入追踪定义。
团队协作中的隐患
  • 新成员难以快速理解隐式类型逻辑
  • 重构时类型变更不易察觉
  • IDE自动补全效果受限
建议在类型清晰或冗长时使用auto,而在接口边界、关键逻辑路径中显式声明类型,平衡简洁与可维护性。

第三章:auto 与模板编程的协同作用

3.1 从模板类型推导看 auto 的底层逻辑

C++ 中的 `auto` 并非简单的“自动类型”,其本质与函数模板的类型推导机制紧密相关。理解这一点,需从模板参数推导规则入手。
模板推导与 auto 的对应关系
当使用 `auto` 声明变量时,编译器会将其视为模板推导中的 `T`。例如:
auto x = 42;           // 等价于 template<typename T> void func(T x); func(42);
const auto& y = x;     // 推导为 const int&
此处 `x` 的类型推导忽略顶层 `const` 和引用,与模板中 `T` 的推导规则一致。
核心规则对比表
声明方式初始化值推导结果
auto xintint
auto& xconst intconst int&
const auto xintconst int

3.2 在泛型 lambda 中使用 auto 的优势

在 C++14 及以后标准中,lambda 表达式支持使用 auto 作为参数类型,从而实现泛型 lambda。这一特性极大增强了 lambda 的灵活性和复用能力。
简化模板逻辑
无需显式定义函数模板,即可编写适用于多种类型的可调用对象:
auto add = [](auto a, auto b) {
    return a + b;
};
上述 lambda 可接受任意支持 + 操作的类型,如 int、double 或自定义类。编译器为每次调用推导出具体类型,等效于生成一个函数对象模板。
提升代码通用性
  • 减少重复代码,避免为相似逻辑编写多个重载函数;
  • 与 STL 算法结合时,能无缝处理不同容器或迭代器类型;
  • 支持完美转发和移动语义,保持高效参数传递。

3.3 结合 decltype(auto) 实现精准类型保留

在现代C++中,`decltype(auto)` 提供了一种精确推导表达式类型的机制,尤其适用于需要保留引用或顶层const属性的场景。
与普通 auto 的区别
`auto` 会忽略引用和顶层 const,而 `decltype(auto)` 完全按照表达式类型推导,保留所有语义信息。

int x = 10;
const int& func() { return x; }

auto        a = func();  // 类型为 int
decltype(auto) b = func();  // 类型为 const int&
上述代码中,`a` 被推导为值类型,发生拷贝;而 `b` 精确保留了 `const int&` 类型,避免了不必要的复制,适用于高性能场景。
典型应用场景
  • 转发函数返回值,保持原始类型语义
  • 模板编程中泛化返回类型推导
  • 实现通用代理接口时避免类型截断

第四章:auto 在现代 C++ 容器与算法中的实战

4.1 遍历容器时 auto& 与 const auto& 的选择

在C++中遍历容器时,合理使用 `auto&` 和 `const auto&` 能有效提升性能并避免意外修改。
何时使用引用类型
当容器元素为大型对象(如自定义类)时,应避免值拷贝。使用引用可减少开销:
std::vector<std::string> words = {"hello", "world"};
for (const auto& word : words) {
    std::cout << word << std::endl; // 只读访问,推荐 const auto&
}
该代码通过 `const auto&` 避免拷贝字符串,同时防止修改原数据。
可变引用的适用场景
若需修改容器内元素,则使用 `auto&`:
for (auto& word : words) {
    word[0] = std::toupper(word[0]); // 修改首字母大写
}
此时 `auto&` 提供非常量引用,允许原地修改。
  • const auto&:适用于只读场景,安全且高效
  • auto&:用于需要修改元素的循环
  • 仅在元素为内置类型(如 int)时可直接用 auto

4.2 使用 auto 简化迭代器声明的典型场景

在C++开发中,容器迭代器的类型往往冗长且复杂,特别是在使用标准库容器与自定义比较器时。`auto`关键字能显著简化代码,提升可读性。
遍历标准容器
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
    std::cout << *it << " ";
}
上述代码中,`auto`自动推导出`std::vector<int>::iterator`类型,避免了显式书写复杂类型。
结合范围循环的现代用法
更进一步,`auto`可与范围-based for循环结合:
for (const auto& num : numbers) {
    std::cout << num << " ";
}
此处`const auto&`确保以常量引用方式访问元素,避免拷贝,适用于大型对象。
  • auto 减少类型错误风险
  • 提升代码维护性与可读性
  • 适配Lambda表达式等复杂类型场景

4.3 与范围 for 循环结合的最佳实践

在现代 C++ 编程中,范围 for 循环(range-based for loop)极大简化了容器遍历操作。结合自动类型推导和引用语义,可显著提升代码可读性与性能。
使用 const 引用避免不必要的拷贝
当遍历大型对象容器时,应优先使用 const 引用防止复制开销:
std::vector<std::string> words = {"hello", "world"};
for (const auto& word : words) {
    std::cout << word << std::endl;
}
上述代码中,const auto& 自动推导元素类型并以常量引用访问,避免了字符串拷贝,适用于只读场景。
修改元素时使用非 const 引用
若需修改容器内容,应使用非常量引用:
for (auto& num : numbers) {
    num *= 2;
}
此例将容器中每个元素翻倍,auto& 确保对原元素的直接修改。
  • 优先使用 const auto& 遍历只读数据
  • 修改元素时使用 auto&
  • 避免值传递遍历大型对象

4.4 在返回复杂类型的函数调用中合理使用 auto

在现代C++开发中,函数常返回如 std::vector<std::pair<int, std::string>> 等复杂类型。手动声明变量接收这类返回值易导致代码冗长且难以维护。
auto 的优势
使用 auto 可自动推导表达式类型,提升代码可读性与安全性:

auto result = getComplexData(); // 自动推导为 vector>
for (const auto& item : result) {
    // 遍历处理
}
上述代码中,getComplexData() 返回一个复杂容器类型。auto 消除了冗长的类型声明,并确保类型精确匹配,避免隐式转换错误。
适用场景对比
场景是否推荐使用 auto
lambda 表达式返回是
STL 容器嵌套结构是
基本数据类型(int/float)否

第五章:总结与常见误区剖析

忽视索引设计的边界场景
在高并发写入场景下,过度索引会导致写性能急剧下降。例如,在日志类系统中为每一列创建索引,反而使插入延迟增加 3 倍以上。应根据查询模式精简索引,避免“全列覆盖”思维。
  • 优先为 WHERE、JOIN 和 ORDER BY 字段建立复合索引
  • 定期使用 EXPLAIN ANALYZE 检查执行计划
  • 避免在低选择性字段(如性别)上单独建索引
事务隔离级别的误用
开发者常默认使用 READ COMMITTED,但在金融扣款场景中可能导致重复扣费。某支付系统因未升级至 REPEATABLE READ,在高并发下出现幻读,造成账户余额异常。
-- 正确做法:显式声明事务级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE user_id = 123 FOR UPDATE;
-- 执行扣款逻辑
UPDATE accounts SET balance = balance - 100 WHERE user_id = 123;
COMMIT;
连接池配置缺乏压测验证
连接池大小平均响应时间 (ms)错误率 (%)
10450.2
1001208.7
50380.1
某电商系统上线初期设置数据库连接池为 200,导致数据库线程耗尽。经 JMeter 压测发现,最佳值为 CPU 核数 × 2 + 阻塞系数,最终稳定在 50。
C++ | auto是什么意思?如何使用?详细讲解 在使用auto时,编译器只会堆第一个类型进行推导,然后用推导出来的类型定义其他变量。在同一行定义多个变量是,这些变量必须是相同的类型。auto “变量名称” = “赋值的内容”; 阅读详情

相关推荐

cpp中auto, auto &和const auto &的区别

笔者初学cpp,如有纰漏,请见谅并指正。 用在哪 auto用于推断类型,具体可用于声明变量时根据初始化表达式自动推断该变量的类型,也就是可用在for循环。 也可以用于声明函数返回值的占位符。 怎么用 这里主要讲for循环中三者的区别 直接说结论 auto auto用于copy一份集合中的数据,对于这种情况,在循环体中不论怎么修改copy的数据,是不会影响到原有集合中的数据的。 举个简单的例子 int arr[5] = {0, 1, 2, 3, 4}; cout << "使用auto" <&

NinoSun的博客 3173

C++ 中的 auto的用法

auto的原理就是根据后面的值,来自己推测前面的类型是什么。 auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替。 1.用auto声明的变量必须初始化(auto是根据后面的值来推测这个变量的类型,如果后面没有值,自然会报错) 2.函数和模板参数不能被声明为auto(原因同上) 3.因为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转...

Mercury_cc的博客 4219

C++ auto的使用

auto是 C++ 中用来自动推导变量类型的关键字,能简化代码,减少重复。auto常用于 STL 容器的迭代器、复杂的模板类型、指针、引用等类型较复杂的变量。auto可以与和const一起使用,以推导引用类型和常量类型。使用auto可以让代码更简洁和灵活,尤其是在类型推导复杂的情况下。auto是 C++11 引入的特性,从 C++14 开始,auto在许多地方得到了更广泛的应用,它大大提高了代码的可维护性和可读性。

m0_49476241的博客 1075

C++中auto关键字的使用

简述C++中auto关键字的使用

qq_56416885的博客 2557

【NLG】(六)文本生成评价指标—— ROUGE原理及代码示例

前奏: 【NLG】(一)文本生成评价指标——BLEU原理及代码示例 【NLG】(二)文本生成评价指标—— METEOR原理及代码示例 【NLG】(三)文本生成评价指标—— ENTROPY原理及代码示例 【NLG】(四)文本生成评价指标—— diversity原理及代码示例 【NLG】(五)文本生成评价指标—— kl_divergence原理及代码示例 1.ROUGE原理 2.优缺点 3.如何算ROUGE ...

凝眸伏笔的博客 1万+

嘉立创EDA实战:从点亮第一盏灯到完成首块PCB

本文详细介绍了使用嘉立创EDA从点亮第一盏LED灯到完成首块PCB的全过程。通过实战案例分享,包括原理图绘制、PCB设计、DRC检查、覆铜操作等关键步骤,帮助电子设计爱好者快速掌握嘉立创EDA的使用技巧,并避免常见的设计错误。

weixin_30314793的博客 368

C++中的auto,你是这样用的吗

一、简介 auto关键字是能被称为C++中的语法糖系列的关键字,为什么这么说呢,因为这些关键字可以让代码变得非常的省事,不那么繁琐,这对于程序员来说,是一大利好。 提到auto关键字,就不得不提到它的更迭了。 1. C/C++98: 早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量。 但是非常遗憾的是,一直没有人使用它,这是什么原因呢? 原因非常简单:因为在早期的C/C++中,auto被用来修饰局部变量,表明该变量是一个自动变量,这就意味着在函数结束之后,函数的栈帧就

weixin_46196863的博客 4099

小样本物体检测

Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector 关键:提出了一个小样本数据集:数据集 步骤: 提取support img为一过滤特征 使用support img的特征来过滤query img,最后将过滤后的特征输入RPN网络中 RPN网络层的输出,会进行多头判断,使用全局信息检测,使用局部信息检测,一对多检测 Attention-Based Region Proposal Network Increme

qq_21157073的博客 5263

C++中auto用法

C++ auto用法记录,介绍了auto的概念,使用原因,注意事项等

qq_38228260的博客 2万+

WorldQuant Brain Alpha 生成器

一个自动化工具,通过参数优化和回测来挖掘高质量的量化交易 Alpha 因子,并自动提交符合标准的因子。

weixin_37582383的博客 1万+

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 115

C++之auto的使用

https://blog.csdn.net/huang_xw/article/details/8760403 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。 1. 自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。 #include <vector> #include <map> using nam...

zyc2018的博客 1万+

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

c++中auto

auto 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量 C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。 语法糖: 简单的识别变量类型 这个还不能体现出 auto 的真正意义. 但是当类型名过长时, auto 的作用就发挥出来...

Sock的博客 2万+

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7682

【人工智能】提示词工程:让大模型精准响应的核心技术,提示词的基础框架 以及 常见提示词框架及场景

编写提示词的基础原则包括:简单、明确、详细,提示词拥有零样本提示、少样本提示、分配角色、提示写作风格、限定输出格式等技巧。

奶爸的编程之路,也就一周冷个三天 1128

c++中的auto、const auto&

auto:在块作用域、命名作用域、循环初始化语句等等 中声明变量时,关键词auto用作类型指定符。 const:修饰符 ​ 想要拷贝元素:for(auto x:range) ​ 想要修改元素 : for(auto &&x:range) ​ 想要只读元素:for(const auto& x:range) auto ​ auto即 for(auto x:range) 这样会拷贝一份range元素,而不会改变range中元素; 但是!(重点) 使用for(auto

群山的博客 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++auto的使用

C++的auto关键字用于自动推导变量的类型,让编译器根据变量的初始化表达式来确定其类型。使用auto可以简化代码,并且可以在某些情况下提高代码的可读性和灵活性。使用auto声明变量时,变量的类型将根据初始化表达式的类型进行推导。// x的类型将被推导为int// y的类型将被推导为double// z的类型将被推导为const char*auto也可以和引用一起使用,用于自动推导引用的类型。// ref的类型将被推导为int&auto还可以与模板一起使用,用于自动推导模板类型。

qq_74013365的博客 8493

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++ auto关键字使用

C++11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子: int a = 10; auto au_a = a;//自动类型推断,au_a为int类型 cout << typeid(au_a).name() << endl; typeid运算符可以输出变量的类型。程序的运...

年轻气盛 温顺尚早 5万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++关键词auto详解

本文主要讲解了C++中auto关键词的使用。

顾得泉的博客 3155

c++ auto类型用法总结

一、用途 auto是c++程序设计语言的关键字。用于两种情况 (1)声明变量时根据初始化表达式自动推断该变量的类型 (2)声明函数时函数返回值的占位符 二、简要理解 auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。 举例:对于值x=1;既可以声明: int x=1 或 long x=1,也可以直接声明 auto x=1 三、用法

小拳头的博客 9万+

c++里面的auto类型

C++中的auto关键字是C++11标准中引入的一个新特性,旨在提高C++开发人员的开发效率和可读性。本文章将介绍auto关键字的用法,单纯作为笔记来使用,相关具体特性还需查阅官方.

zcw_jszs的博客 6469

modern-cpp 现代 C++ 教程:高速上手 C++ 11/14/17/20

第 1 章 迈向现代 C++ 编译环境:本书将使用 clang++ 作为唯一使用的编译器,同时总是在代码中使用 -std=c++2a 编译标志。 > clang++ -v Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.6.0 Thread model: posix InstalledDi...

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 3309

C++ Range - for_each3: CPP_auto_fun的实现

CPP_auto_fun CPP_auto_fun是通过一系列宏定义实现的。先看它的调用的几个宏定义。 CPP_PP_CHECK #define CPP_PP_CHECK(...) CPP_PP_CHECK_N(__VA_ARGS__, 0,) #define CPP_PP_CHECK_N(x, n, ...) n CHECK扩展成0或者第二个参数。 代码 CPP_PP_CHECK(); ...

weixin_43530460的博客 302

C++ auto 关键字的使用

C++ auto 关键字的使用 https://www.cnblogs.com/KunLunSu/p/7861330.html C++98 auto 早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期: int a =10 ; //拥有自动生命期 auto in...

jacke121的专栏 2405

C++11中的auto关键字

auto不能用于函数声明中代替返回类型,但在C++14及更高版本中,你可以使用auto在函数声明中的尾置返回类型(trailing return type)来指示函数的返回类型,但这种情况下auto不是用来推导局部变量或函数参数的类型,而是用于指定函数的返回类型依赖于其参数的类型或函数体内的其他逻辑。虽然auto可以推导出指针和引用的类型,但对于复杂的指针和引用类型(如多层指针、指向数组的指针等),auto的使用可能会让代码可读性变差。使用auto可以自动推导迭代器的类型,使代码更简洁。

947
上一篇: 揭秘C++17编译期逻辑控制:if constexpr嵌套如何彻底改变模板编程格局
下一篇: 【高性能C++编程必修课】:深入理解weak_ptr::lock的线程安全与性能开销
LearnFlow
博客等级 码龄1年 150粉丝 2113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值