C++ STL 之源码阅读路线

【游戏编程扯淡精粹】TinySTL源码阅读 【游戏编程扯淡精粹】TinySTL源码阅读 文章目录【游戏编程扯淡精粹】TinySTL源码阅读学习目标学习路线进度清单编译问题TinySTL\Detail\Vector.impl.h(55): error C2572: 'TinySTL::vector实际看了,会发现也并没有很难,比起阅读《C++标准库》这样的砖头API书籍,要更为容易和高效 学习目标 掌握一种STL实现 了解C++模板编程 学习路线 从单元测试开始看起 进度清单 pair:100% algorithm:20% vector:1 阅读详情

C++ STL 之源码阅读路线

一、读源码的起点在哪

STL 是 C++ 标准库最核心的组件,面试爱考、项目常用。但 STL 源码动辄几十万行,从哪读?怎么读?

侯捷《STL 源码剖析》给出了经典路线:

vector/list/deque → stack/queue/priority_queue (适配器) → 
map/set/multimap/multiset → algorithm → allocator

先读序列容器(vector、list、deque),再读关联容器(红黑树底层),再读算法和分配器,这是从易到难的最优爬坡路径。

但侯捷书写于 2002 年,基于 SGI STL。现代 GCC 已演进到 libstdc++,源码在 bits/ 目录下。本文带你直接对接 GCC 最新实现。

二、STL 源码目录结构

GCC 的 STL 头文件分散在以下路径(以 GCC 12 为例):

include/c++/bits/

stl_vector.h
容器定义

vector.tcc
模板实现

stl_tree.h
红黑树

stl_deque.h
双端队列定义

deque.tcc
双端队列实现

stl_algobase.h
基础算法

stl_algo.h
算法实现

allocator.h
分配器

编译期:parser 展开
#include 实例化

目标代码
.o / .exe

关键约定:.h 后缀(如 stl_vector.h)是类定义 + 内联实现,.tcc 后缀(如 vector.tcc)是长模板函数实现,会被 .h 在末尾 #include 进来。所以看 insert、push_back 的完整实现要去 .tcc。

三、核心源码行索引

vector::insert → _M_insert_aux → 扩容 2 倍

vector::push_back 和 vector::insert 最终都走到 _M_insert_aux。关键源码在 bits/vector.tcc:

// bits/stl_vector.h:1197 — push_back 调用 _M_insert_aux(end())
// bits/vector.tcc:427  — _M_insert_aux 定义

逻辑如下:

template<typename _Tp, typename _Alloc>
void vector<_Tp, _Alloc>::_M_insert_aux(iterator __position, const _Tp& __x)
{
    if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) {
        // 还有备用空间:直接把尾部元素后移,插入
    } else {
        const size_type __old_size = size();
        const size_type __new_size = __old_size != 0 ? 2 * __old_size : 1;
        // 扩容:新大小 = 旧大小 × 2(非空时)
    }
}

2 倍扩容不是标准强制,是 GCC 的选择。__old_size != 0 ? 2 * __old_size : 1 保证空 vector 首次扩容到 1。此策略均摊 O(1)。

deque::operator[] → _M_map[block] + offset

deque 是分段连续空间,不保证所有元素物理连续。operator[] 的实现是双重下标:

// bits/stl_deque.h:905
// _M_map       → 指向中控器数组(每个元素指向一个 buffer)
// _M_map[block] → 找到元素所在的 buffer 指针
// + offset     → buffer 内的偏移

伪代码:

reference operator[](size_type __n) const {
    return *(this->_M_impl._M_start + __n);
    // _M_start 的 operator+ 内部做了 block = __n / buffer_size()
    // offset  = __n % buffer_size() + 起始偏移
    // return _M_map[block][offset];
}

一次 operator[] = 一次除法 + 一次取模 + 两次指针解引用。比 vector 慢,但双端插入 O(1)。

红黑树 _Rb_tree_insert_rebalance

关联容器 map/set 底层是红黑树。GCC 红黑树实现在 bits/stl_tree.h。

插入再平衡函数签名:

// bits/stl_tree.h:905
void _Rb_tree_insert_rebalance(const _Rb_tree_node_base* __x,
                                _Rb_tree_node_base* __root,
                                _Rb_tree_node_base* __leftmost,
                                _Rb_tree_node_base* __rightmost);

旋转逻辑核心(简化):

场景操作源码位置
叔节点为红变色 + 向上递推__y = __x->_M_parent->_M_parent->_M_right 判红则全层变色
叔节点为黑,内侧先左旋变外侧__x = __x->_M_parent; _Rb_tree_rotate_left(__x, __root);
叔节点为黑,外侧右旋 + 变色_Rb_tree_rotate_right(__parent->_M_parent, __root);

保证五条红黑树性质(根黑、叶黑、红子黑、黑高相同),插入后最多两次旋转,O(log n)。

四、从源码到编译的映射

#include

编译器搜索
include 路径

找到
bits/stl_vector.h

模板定义
仅在实例化时编译

实例化
vector

展开 _M_insert_aux
等成员函数

链接 libstdc++.so
或完全内联

STL 是纯模板库,头文件即实现。#include <vector> 不会生成任何代码,直到你写了 vector<int> 才实例化。这也是为什么 STL 源码几乎全是 .h/.tcc 而没有 .cpp——编译期展开才是真正的编译。

五、面试题

1. vector 扩容为什么是 2 倍?1.5 倍行不行?

2 倍保证均摊 O(1),且旧内存块一定小于新块,可被 OS 回收。1.5 倍可复用旧内存碎片,微软和某些早期实现用过,但 GCC/clang 选 2 倍。

2. vector::insert 在末尾插入一定比 push_back 慢吗?

本质上 push_back 就是 insert(end(), x),经内联优化后几乎等价。

3. deque::operator[] 的时间复杂度真是 O(1) 吗?

摊还是 O(1),但常数比 vector::operator[] 大(含除法和取模)。实测慢约 2–5 倍。

4. map::operator[] 和 map::insert 有什么区别?

operator[] 在 key 不存在时会调用 value 类型的默认构造并插入,返回引用;insert 不修改已存在 key。误用 operator[] 会导致非预期的插入。

5. 红黑树相比 AVL 树的优势是什么?

红黑树插入最多 2 次旋转,删除最多 3 次旋转;AVL 严格平衡,旋转更频繁。STL 选红黑树是为了增删性能。

6. std::list::size() 是 O(1) 还是 O(n)?

C++11 前 list::size() 可以是 O(n);C++11 强制 O(1)。GCC 的实现从 4.6 开始就缓存了节点计数。

7. unordered_map 的 rehash 策略是什么?

GCC 的 unordered_map 负载因子默认 1.0,超过后 rehash 到质数个 bucket(约 2 倍),每次 rehash 全量搬移元素。

六、阅读建议

  1. 从 vector 开始——代码最少、逻辑最直,读完 stl_vector.h + vector.tcc 约 900 行,半天搞定
  2. 再看 deque——理解分段连续空间和中控器 _M_map,这是 STL 最巧妙的结构之一
  3. 攻克 stl_tree.h——红黑树 1200 行,建议配合画图理解旋转
  4. 最后 allocator——GCC 的 __pool_alloc 和 __mt_alloc 可选读

源码是 C++ 最好的教科书。与其背面试八股,不如亲自打开 bits/vector.tcc:427 看一眼 _M_insert_aux——一行代码胜过十篇面经。

[学习路线]C++自学路线安排 入门:《大话数据结构》和《算法图解》(这两本书较为简单,涉及细节少,但是对于新手比较有好,而且内容有趣,推荐一星期内看完两本,了解大概然后看基础书籍)C++系列书:《C++prime 第五版》->《Effective C++》->《STL源码剖析》->《深度探索C++对象模型》(《计算机网络自顶向下》重点章节2,3,4,5,6,《TCP/IP详解》反复阅读与实践联合)选看:《Linux高性能服务器编程》->《UNIX环境高级编程》->《UNIX网络编程》书籍:必看:《鸟哥私房菜》->《Linux网络编程》 阅读详情

相关推荐

C++ 学习路线推荐

相信有很大一部分学计算机的童鞋都是靠自学,即使本身是计算机专业的同学,也会觉得仅仅通过课堂上的学习是远远不够的,而且在上课时所用到的教材也不够好。然而自学的时候有个很大的问题就是找不到合适的方向和学习路线,我在刚开始的时候也吃过这样的亏,总是纠结于语言的学习,觉得编程就是学很多语言。然而单纯学习语言并不能解决问题,我们需要学习的是一个完整的体系,而编程语言只不过是其中一个解决问题的工具而已。后来我

常敲代码手不抖 1万+

C++学习路线---加油呀

转载自 编程剑谱公众号 1、 C++ 基础:C++ 是面向对象的语言,一定要理解清楚面向对象的思想,先把 C++ 的基础知识点打牢,刚从面向过程中转变过来,一定一定要适应面向对象的写法。 在学习面向对象的时候,也要考虑如何用面向过程去实现面向对象(其实也就是结构体中有一个成员是函数指针),对于 C++ 的基础知识,我简单罗列如下: 1、const的用法 2、引用的用法 3、#define用法 4、...

qq_37299596的博客 398

如何系统的学习c++

大家好,我是羽峰,一个c++刚入门的小白,本文整理了一些c++学习路线,当然自己也在路上,期待与您一起成长。如有需要,欢迎关注“羽峰码字”公众号,我们一起畅聊人生。 学习C++ 可以分为几个阶段 1. 入门 1.1C语言基础 首先是c语言基础 基础的语法:变量、条件、循环、字符串、数组、函数、结构体等 C语言重点:指针、内存管理 推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》 当然这只是c++基础,理解就好,当然,指针和内存管理是很重要的,建议多理解,多看看...

m0_37940804的博客 4984

C++路线(全网20篇高赞文章总结)

C++路线,包含书籍,视频等

IT OR 考公? 8191

小白 C++ 入门并发疯学习路线(书单)

真人就是我自己,这是我的 C++ 学习之路总结。 具体总结前,想先回答一个问题——要不要先学C,再学C++? 我作为小白时疑惑过这个问题,在此给后来的小白和当年的自己一个答案。 个人看法是,学习C++,就直接学习C++,不用先学C。在微软维护STL的Stephen Thomas Lavavej都说他当年学C++之前学C语言浪费了大量的时间,早知道就直接从C++开始。 因此,我这篇文章基本不提C的学...

振之的博客 3万+

C++ & Linux后端开发进阶之:C++的开源项目

在前文【C++ & Linux后端进BAT的学习路线】中,讲述了C++后端的学习路线。进一步,本文讲解两个问题: 怎么阅读学习C++源码 学习哪些C++项目 怎么学习 在介绍具体的C++项目之前,先介绍我自己学习开源项目、阅读源码的方式: 首先!!!要学会使用这个项目。以STL为例,应该极少有人学习STL是直接从阅读STL源码开始的,基本都是从学习std::vector、std::list等容器的使用方式开始。当你能熟练使用了,才有会更好的基础来对内部实现一探究竟。 再看看有没有相关书籍、博客

loOK后端 3242

【C++】标准模板库(STL)—— 学习算法的利器

STL(Standard Template Library,标准模板库)是 C++ 标准库的重要组成部分,包含丰富的数据结构和算法,是现代 C++ 编程中必不可少的工具。本文将介绍 STL 的基本组成、学习重点以及学习 STL 前应具备的先修知识和学习路线,帮助你系统高效地掌握 STL。容器(Containers):用于存储和管理数据集合,例如vectorlistsetmap等。算法(Algorithms):提供排序、查找、遍历等通用操作函数。迭代器(Iterators)

Sagittarius_A*的博客 1270

小白C++入门到发疯学习路线(书单整理)

前言 这篇文章实际上是我自己入门过程的总结,一个尽量少废话的C++入门指南。总结完忽然发现像个读书清单????。 具体总结前,想先回答一个问题——要不要先学C,再学C++? 个人看法是,单就学习C++而言,直接学习C++就可以了,不用先学C。在微软维护STL的Stephen Thomas Lavavej都说他当年学C++之前学C语言浪费了大量的时间,早知道就直接从C++开始。 很多老的项目是C语言写的,之后的编程生涯多半还是绕不开学C语言,不过那时候你已有C++功底,构不成啥大问题。 因此,这篇文章基本不提

pangzizzzz的博客 1052

《C++ STL:vector类(下)》:攻克 C++ Vector 的迭代器失效陷阱:从源码层面详解原理与解决方案

【C++ vector迭代器失效问题深度解析】 本文系统分析了C++中vector容器迭代器失效的核心问题和解决方案。主要内容包括: 迭代器失效机制 底层原理:迭代器本质是指针,失效源于指向空间被释放 典型场景:insert/push_back等扩容操作导致旧空间释放 删除操作:erase后元素前移,若删除末尾元素会使迭代器指向end 解决方案对比 Windows(vs)严格检测:操作后必须重置迭代器 Linux(g++)较宽松:部分情况仍可运行但结果不可靠 正确做法:insert/erase后接收返回值更

心向往之,行必能至 1262

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4024

B站充电视频下载器(需配合会员Cookie使用,仅供学习交流,Python)

这个程序是一个用于下载B站充电视频的工具,依赖于用户提供的会员Cookies。

qq_40753021的博客 2万+

C++学习路线与推荐书籍

很多人也许像我一样都想找一份学习的辟邪剑谱,转一个别人的帖子,希望对能够给用的。欲练此功,不必挥刀自宫的,呵呵。         这句说的好:“最后,编程语言并非计算机科学技术的全部,尤其对于在校的学生来说,打好基础、开阔视野都是非常重要的。” 一)语言入门: 《C++ Primer》 最新版本:第三版(第四版国外已上架,国内一些网上书店也在预订中) 适合有丰富C经验,缺乏C++经验的。

lijun5635的专栏 3万+

智能车竞赛飞檐走壁组立体赛道电磁引导线设计与实现

本文深入解析了智能车竞赛飞檐走壁组立体赛道电磁引导线的核心设计与实现。针对垂直面、圆筒、跷跷板等立体元素,详细阐述了电磁线规格参数选择、三维空间铺设技巧及磁场调试方法,旨在帮助参赛队伍打造稳定可靠的导航系统,提升车模在复杂立体赛道上的通过率与稳定性。

bert9linguist的博客 280

【C++STL :vector类 (二) 】C++ Vector迭代器失效避坑指南:原因与解决方案详解

此时迭代器是无效的,++it导致程序崩溃——// 此时迭代器是无效的,++it导致程序崩溃int main()while (it!return 0;运行结果——// 使用第一组数据时,程序可以运行1 3 5// 使用第二组数据时,程序最终会崩溃。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1673

【Excel VBA 编程】批量核对两张表格数据,行和列显示顺序均被打乱

利用数据字典在 Excel 中进行表格数据的核对,该表格含有多行多列,并且行和列顺序是打乱的,批量核对数据后将差异输出

wei1019的专栏 1293

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF)

米哈游是全球知名游戏开发商,以《原神》《崩坏》系列著称,专注二次元文化与AI技术创新。本文整理了10道AI产品经理面试题,涵盖Transformer架构、智能NPC设计、机器学习应用、AIGC产品规划等核心领域。题目既考察技术理解(如RAG原理、多模态模型),又关注产品落地(游戏平衡性优化、伦理安全),同时强调跨团队协作能力。参考答案均结合米哈游业务场景,体现技术驱动与玩家体验并重的产品思维,展现AI在游戏行业的创新应用前景。

ZHHHHH15的博客 681

Linux C++后端开发学习路线参考汇总

文章目录Linux C++后端开发学习路线参考汇总如何快速掌握C++?路线一(<6个月):知乎Milo Yip路线二(<1年):华中大守门员一、C++基础(3个月)二、计算机网络(1个月)三、操作系统(1个月)四、网络编程(1个月)五、数据结构与[算法]()及[刷题]()(2个月)六、mySQL数据库(7天~15天)七、[项目]()(2个月)总结路线三(<3年):编程指北正文一、后端/后台/服务器开发?二、后台开发都考察哪些?三、C/C++四、操作系统五、计算机网络六、网络编程七、系统级编

xmcy001122的专栏 7122

高通Camx功能feature分析之二:remosaic流程

本文介绍了Remosaic技术及其在图像处理中的应用。Remosaic是将4cell1像素排布还原为普通Bayer结构的过程,分为硬件和软件两种实现方式。文章详细解析了Remosaic流程,包括配流情况、Feature选择、初始化过程,以及触发拍照的完整流程。重点分析了从普通预览切换到全尺寸拍照的关键步骤:激活全尺寸RDI会话、生成请求、等待就绪、唤醒离线线程和重启预览。通过代码层面的分析,揭示了Remosaic技术如何实现高分辨率图像还原,同时说明了该过程中可能出现的预览定屏现象及其原因。

1880

AI回答:Linux C/C++编程学习路线

按照以上路线坚持学习,你将逐步掌握Linux C/C++编程的核心技能,成为一名优秀的开发者!学习C++11/14/17/20的新特性:Lambda表达式、智能指针、并发库等。:LeetCode(算法练习)、CppReference(文档查询)。:B站、Coursera上的Linux C/C++课程。进程间通信(IPC):管道、消息队列、共享内存、信号。学习select、poll、epoll等多路复用技术。配置开发工具:GCC、GDB、Make、CMake。语法基础:变量、数据类型、控制语句、函数。

ctrigger的专栏 1549

大模型多智能体协作面试题及参考答案

在多智能体系统里,代理定义自身目标或效用函数的过程与系统架构、应用场景紧密相关。从本质上讲,目标是代理行为的导向,而效用函数则是对目标达成程度的量化评估。代理通常依据自身角色、系统全局需求以及与其他代理的交互关系来确立目标。比如在合作型 MAS 中,代理目标可能需要与全局目标对齐,像多个物流机器人协作完成货物配送时,每个机器人的目标会围绕 “高效完成分配任务”“避免路径冲突” 等展开,其效用函数可能涉及任务完成时间、能耗等指标的加权求和。目标定义的方式存在多种类型。

大模型大数据攻城狮的专栏 1022

包络检波电路(Envelope Detector)

把 100 kHz 载波想象成"电台的高频信号",把 1 kHz 包络想象成"主持人说话的声波"。而今天电路的工作,就是把这个"调大调小的外壳"(包络)重新剥出来,还原成主持人的声音 🎵。这是三极管开关电路的重要搭档,也是从"二极管家族"过渡到"三极管家族"的桥梁 🔌。——倍压整流看的是"幅值累积"(多个电容接力),包络检波看的是"频率分离"(高低频分开)。同样的"D1 串联 + RC 并联"拓扑,今天被赋予了"AM 解调"的新生命。——电感负载的"泄洪闸",保护三极管开关不被反向电动势击穿。

飞多学堂的博客 94

【玩转STL】STL的简介和string类用法和接口讲解(源码解析)_string stl reserver

1.1简介STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。1.2 STL的版本原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。HP 版本–所有STL实现版本的始祖P. J. 版本。

2401_84265592的博客 951

西安交通大学软件学院——分布式系统练习题(综合题)

摘要:本文探讨了分布式系统的核心特性与关键问题。首先阐述了分布式系统的8种透明性特性,包括访问、定位、迁移等。然后通过具体案例分析了分布式事务的回滚机制、域名解析的迭代与递归过程、不同分布式系统的异同比较。重点讨论了RPC通信中客户端/服务器崩溃的处理方法,包括消灭、再生和到期三种策略。最后介绍了Lamport时间戳算法在进程通信中的应用及问题解决方案。全文涵盖了分布式系统设计中的透明性、可靠性、一致性等核心问题。

qq_73044452的博客 204

C++后端开发路线必读书籍

C++后端开发路线:(总共分了四个大项,每个大项之间是可以同步进行的) 语言工具方面: 必读: 1.《C++ primer》(感到吃力的话可以先看《C++ primer plus》,找时间再把《C++ primer》看一遍)这本不用介绍了吧- - 2.《effective C++》C++是一门相对很复杂的语言,复杂也就意味着不好掌握他,很容易就写出坑,而这本书就是帮助你去避免一些常见的坑 3.《C++ 标准库》STL总得会吧?超厚的一本,劝退神作... 4.《effective STL》避...

Lifelong Learning Pan 2723

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 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++学习路线大公开

摄于2020-12-11 上海环球港 一乐拉面大家好,我是阿秀。前言上篇文章发布后,问我如何学习 C++ 的小伙伴可远比问我如何写简历和刷题的多多了,思虑再三还是先把自己的 C++ 学习...

博客 1873

SAP B1中文培訓教材_SDK

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

C++入门学习路线、学习计划,推荐学习资料和书籍

以下是详细计划,适合零基础或初学者。- 硬件平台:Arduino Uno(入门,约 100 元)、Raspberry Pi 4(进阶,约 300 元)、STM32(工业级,约 200 元)。- 周1-2:变量、控制结构,每天 1 小时理论 + 1 小时编码,练习 5-10 个简单题目(如求和、判断素数)。- STL(标准模板库):vector、map、set、algorithm(如 sort、find)。- 周5-6:类与对象,设计 1-2 个类(如 Point、Rectangle),实现简单功能。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 2030

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: C++ STL之正则表达式详解
下一篇: C++ STL 之 initializer_list、结构化绑定与 if constexpr 详解
Ricky_Theseus
博客等级 码龄3年 126粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricky_Theseus

感谢大家,祝您生活愉快

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值