当前位置: 首页 > article >正文

侯捷 C++ 课程学习笔记:C++ 新标准 11/14 的革新与实战应用

在侯捷老师的 C++ 系列课程中,《C++ 新标准 11/14》这门课程让我对现代 C++ 编程有了全新的认识。C++11 和 C++14 是 C++ 语言发展史上的重要里程碑,它们引入了大量新特性,极大地提升了语言的表达能力和开发效率。侯捷老师通过深入浅出的讲解和丰富的实战案例,帮助我快速掌握了这些新特性,并将其应用到实际开发中。以下是我对这门课程的学习笔记和心得体会。

在这里插入图片描述

一、课程核心内容:C++11/14 的革新特性

侯捷老师的课程详细讲解了 C++11 和 C++14 的主要新特性,包括自动类型推导、初始化列表、移动语义、Lambda 表达式、线程支持库等。这些特性不仅提升了语言的灵活性和表达能力,还优化了性能和并发处理能力。

(一)自动类型推导(auto 和 decltype)

C++11 引入了 auto 关键字,允许编译器自动推导变量的类型。这大大简化了代码,尤其是当变量的类型较为复杂时。侯捷老师通过以下代码展示了 auto 的使用:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;auto value = 10; // 编译器推导类型为 intstd::cout << "Value: " << value << std::endl;return 0;
}

侯捷老师还介绍了 decltype 关键字,它可以用于获取变量或表达式的类型。这在模板编程中非常有用。

(二)初始化列表

C++11 引入了初始化列表,允许使用花括号 {} 对对象进行初始化。这不仅适用于内置类型,还支持用户自定义类型。侯捷老师通过以下代码展示了初始化列表的使用:

#include <iostream>
#include <vector>
#include <string>struct Person {std::string name;int age;
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5}; // 初始化列表for (const auto& v : vec) {std::cout << v << " ";}std::cout << std::endl;Person person = {"Alice", 25}; // 初始化列表std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl;return 0;
}

侯捷老师指出,初始化列表不仅简化了代码,还提高了代码的可读性和一致性。

(三)移动语义

C++11 引入了移动语义,允许资源的转移,从而避免不必要的拷贝操作,提升性能。侯捷老师通过以下代码展示了移动语义的使用:

#include <iostream>
#include <vector>
#include <utility> // std::moveclass Buffer {
private:std::vector<int> data;public:Buffer(size_t size) : data(size) {std::cout << "Buffer created" << std::endl;}Buffer(const Buffer& other) : data(other.data) {std::cout << "Buffer copied" << std::endl;}Buffer(Buffer&& other) noexcept : data(std::move(other.data)) {std::cout << "Buffer moved" << std::endl;}Buffer& operator=(const Buffer& other) {data = other.data;std::cout << "Buffer assigned" << std::endl;return *this;}Buffer& operator=(Buffer&& other) noexcept {data = std::move(other.data);std::cout << "Buffer moved assigned" << std::endl;return *this;}
};int main() {Buffer buf1(100); // 创建一个 Buffer 对象Buffer buf2 = std::move(buf1); // 移动语义return 0;
}

侯捷老师强调,移动语义是 C++11 的重要特性之一,它能够显著提升程序的性能,尤其是在处理大型对象时。

(四)Lambda 表达式

C++11 引入了 Lambda 表达式,允许在需要的地方定义匿名函数。这使得代码更加简洁和灵活。侯捷老师通过以下代码展示了 Lambda 表达式的使用:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 Lambda 表达式对 vector 进行排序std::sort(vec.begin(), vec.end(), [](int a, int b) {return a > b; // 降序排序});for (const auto& v : vec) {std::cout << v << " ";}std::cout << std::endl;// 使用 Lambda 表达式计算总和int sum = 0;std::for_each(vec.begin(), vec.end(), [&sum](int v) {sum += v;});std::cout << "Sum: " << sum << std::endl;return 0;
}

侯捷老师指出,Lambda 表达式不仅简化了代码,还提高了代码的可读性和可维护性。

(五)线程支持库

C++11 引入了线程支持库,允许开发者更方便地编写多线程程序。侯捷老师通过以下代码展示了线程支持库的使用:

#include <iostream>
#include <thread>
#include <vector>void printThreadId(int id) {std::cout << "Thread " << id << " is running" << std::endl;
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.emplace_back(printThreadId, i); // 创建线程}for (auto& thread : threads) {thread.join(); // 等待线程完成}return 0;
}

侯捷老师强调,线程支持库是 C++11 的重要特性之一,它使得多线程编程更加简单和安全。

二、学习心得:从传统 C++ 到现代 C++ 的转变

通过学习侯捷老师的《C++ 新标准 11/14》课程,我对现代 C++ 编程有了全新的认识。侯捷老师不仅讲解了新特性的理论知识,还通过大量实战案例展示了如何在实际开发中应用这些特性。

(一)新特性的强大功能

C++11 和 C++14 引入的特性极大地提升了语言的表达能力和开发效率。自动类型推导、初始化列表、移动语义、Lambda 表达式和线程支持库等特性,不仅简化了代码,还提高了代码的可读性和可维护性。侯捷老师通过丰富的实战案例,让我深刻体会到了这些特性带来的便利。

(二)性能优化

新特性不仅提升了代码的可读性,还优化了性能。例如,移动语义能够显著减少不必要的拷贝操作,提升程序的性能;线程支持库使得多线程编程更加简单和高效。侯捷老师通过实际案例展示了如何利用这些特性优化程序性能。

(三)现代 C++ 编程理念

侯捷老师的课程不仅让我掌握了新特性,还让我理解了现代 C++ 编程的理念。例如,尽量使用智能指针管理内存,避免手动管理内存带来的风险;使用 Lambda 表达式简化代码,提高代码的可读性和可维护性。这些理念将指导我在未来的开发中写出更高效、更安全的代码。

三、实际应用案例:基于 C++11/14 的项目实践

在学习侯捷老师的课程后,我将所学知识应用到了实际项目中。我们团队负责开发一个高性能的图像处理库,需要处理大量的图像数据。通过侯捷老师对 C++11/14 的讲解,我决定使用 Lambda 表达式和线程支持库来优化图像处理算法。

(一)项目背景

我们的图像处理库需要处理大量的图像数据,每个图像处理任务都可能涉及复杂的计算。传统的单线程处理方式在面对大规模数据时效率较低。为了提高性能,我们决定引入多线程支持,并使用 Lambda 表达式简化代码。

(二)线程支持库的应用

我们使用 C++11 的线程支持库来实现多线程处理。每个图像处理任务被分配到一个单独的线程中,从而充分利用多核处理器的性能。侯捷老师在课程中讲解的线程支持库的使用方法为我们提供了很大的帮助。

#include <iostream>
#include <thread>
#include <vector>
#include <functional>void processImage(const std::string& imagePath) {std::cout << "Processing image: " << imagePath << " in thread " << std::this_thread::get_id() << std::endl;// 图像处理逻辑
}int main() {std::vector<std::string> images = {"image1.jpg", "image2.jpg", "image3.jpg"};std::vector<std::thread> threads;for (const auto& imagePath : images) {threads.emplace_back([imagePath]() {processImage(imagePath);});}for (auto& thread : threads) {thread.join();}return 0;
}

通过使用线程支持库,我们能够将图像处理任务分配到多个线程中,显著提高了处理效率。

(三)Lambda 表达式的应用

在图像处理算法中,我们使用 Lambda 表达式来简化代码。例如,在对图像进行滤波处理时,我们使用 Lambda 表达式定义了滤波函数:

#include <iostream>
#include <vector>
#include <functional>
#include <thread>void applyFilter(const std::vector<int>& image, std::vector<int>& filteredImage, const std::function<int(int)>& filter) {for (size_t i = 0; i < image.size(); ++i) {filteredImage[i] = filter(image[i]);}
}int main() {std::vector<int> image = {1, 2, 3, 4, 5};std::vector<int> filteredImage(image.size());// 使用 Lambda 表达式定义滤波函数auto filter = [](int pixel) {return pixel * 2; // 简单的滤波逻辑};applyFilter(image, filteredImage, filter);for (const auto& pixel : filteredImage) {std::cout << pixel << " ";}std::cout << std::endl;return 0;
}

通过使用 Lambda 表达式,我们能够更简洁地定义滤波函数,提高了代码的可读性和可维护性。

四、总结与展望

通过学习侯捷老师的《C++ 新标准 11/14》课程,我对现代 C++ 编程有了全新的认识,并将其应用到了实际项目中。侯捷老师清晰的讲解和丰富的实战案例让我受益匪浅。在学习过程中,我深刻体会到了新特性带来的便利和性能优化,也理解了现代 C++ 编程的理念。
在未来的学习中,我将继续深入学习侯捷老师的其他课程,如《STL 标准库与泛型编程》和《C++ 面向对象开发》,进一步提升自己的 C++ 编程能力。我相信,在侯捷老师的指导下,我能够在 C++ 的世界中不断进步,成为一名优秀的开发者。
侯捷老师的 C++ 系列课程不仅让我掌握了丰富的知识,还让我学会了如何将这些知识应用到实际项目中。感谢侯捷老师的辛勤付出,让我在 C++ 的学习道路上找到了方向。

相关文章:

侯捷 C++ 课程学习笔记:C++ 新标准 11/14 的革新与实战应用

在侯捷老师的 C 系列课程中&#xff0c;《C 新标准 11/14》这门课程让我对现代 C 编程有了全新的认识。C11 和 C14 是 C 语言发展史上的重要里程碑&#xff0c;它们引入了大量新特性&#xff0c;极大地提升了语言的表达能力和开发效率。侯捷老师通过深入浅出的讲解和丰富的实战…...

拉取Openwrt官方源码 编译固件速通

Openwrt 24.10上星期出了&#xff0c;但是恩山没几个人更新&#xff0c;自己编译一个&#xff0c;记录一下方法。 一切从简&#xff0c;不添加任何插件&#xff0c;资源扔恩山了。 【   】红米AX6000 openwrt V24.10.0 uboot大分区固件-小米无线路由器及小米网络设备-恩山无…...

洗牌加速!车规MCU“冷热交加”

汽车芯片赛道&#xff0c;正在经历新一轮震荡期。 本周&#xff0c;全球汽车芯片巨头—NXP对外披露了不及资本市场预期的四季度的财报&#xff0c;营收同比下降9%&#xff0c;全年下降5%&#xff0c;表明工业和汽车市场需求的低迷仍在持续。 公开信息显示&#xff0c;该公司一…...

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了&#xff08;本地&#xff09;部署大语言模型&#xff0c;适合微调、数据高隐私性等场景。随着Deepseek-R1的发布&#xff0c;大语言模型的可及性得到极大提升&#xff0c;应用场景不断增加&#xff0c;对高可用的方…...

【prompt示例】智能客服+智能质检业务模版

本文原创作者&#xff1a;姚瑞南 AI-agent 大模型运营专家&#xff0c;先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗&#xff1b;多年人工智能行业智能产品运营及大模型落地经验&#xff0c;拥有AI外呼方向国家专利与PMP项目管理证书。&#xff08;转载需经授权&am…...

DeepSeek 本地部署(电脑安装)

1.先安装Ollama 开源框架 网址链接为:Ollama 2.点中间的下载 3.选系统 4.下载好就安装 5.输入命令ollama -v 6.点击Model 7.选如下 8.选版本 9.复杂对应命令 10.控制台粘贴下载 11.就可以问问题啦 12.配置UI界面(在扩展里面输入) 13.配置完即可打开 14.选择刚才安装的就好啦…...

初学java 数据库相关学习

创建数据库&#xff1a; 主键: unsigned primary key auto_increment 外键: foreign key(xx) references table_name(xx) 字段: 类型: int ; tinyint ;char(20);varchar(255); date; datetime; text; float(5,2); double(10,2); long; decimal(15,10) 约束:primary key; foreig…...

【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

spann3r是利用dust3r做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…...

《Python 中 JSON 的魔法秘籍:从入门到精通的进阶指南》

在当今数字化时代&#xff0c;网络编程无处不在&#xff0c;数据的高效传输与交互是其核心。JSON 作为一种轻量级的数据交换格式&#xff0c;凭借其简洁、易读、跨语言的特性&#xff0c;成为网络编程中数据传输与存储的关键技术。无论是前后端数据交互&#xff0c;还是不同系统…...

【漫话机器学习系列】091.置信区间(Confidence Intervals)

置信区间&#xff08;Confidence Intervals&#xff09;详解 1. 引言 在统计学和数据分析中&#xff0c;我们通常希望通过样本数据来估计总体参数。然而&#xff0c;由于抽样的随机性&#xff0c;我们不可能得到精确的总体参数&#xff0c;而只能通过估计值&#xff08;如均值…...

查看引脚电平

在Linux系统中&#xff0c;通过cat命令查看/sys/class/gpio/export文件并不能直接获取GPIO引脚的高低电平。/sys/class/gpio/export文件用于向系统请求导出&#xff08;即启用&#xff09;某个特定的GPIO引脚&#xff0c;而不是用于读取引脚的状态。 1.导出GPIO引脚&#xff1…...

回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核…...

QTreeView添加网格线

一.效果 二.实现 网格线虽然可以用样式表添加,但效果不好。这里重写QTreeView的drawRow函数来实现网格线的绘制。 void QHTreeView::drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {QTreeView::drawRow(painter…...

nvidia-smi执行失败,报错-实战生产

目录 报错日志 解决办法 步骤 1: 检查当前安装的 NVIDIA 驱动版本 步骤 2: 检查 NVIDIA 内核模块是否已加载 步骤 3: 重新安装 NVIDIA 驱动程序 使用 apt 重新安装驱动程序 或者使用 dkms 重新生成内核模块 步骤 4: 确认内核版本和驱动兼容性 步骤 5: 更新 initramfs …...

大脑神经网络与机器神经网络的区别

大脑神经网络(生物神经网络)与机器神经网络(人工神经网络,ANN)虽然名称相似,但在结构、功能、学习机制等方面存在显著差异。以下是两者的主要区别: 1. 基础结构与组成 大脑神经网络: 由 生物神经元(约860亿个)通过突触连接形成动态网络。 神经元通过电化学信号(动作…...

firewall-cmd --zone=public --list-ports 已经添加端口了但是仍无法访问

当您使用 firewall-cmd 命令在 Linux 系统中配置防火墙规则时&#xff0c;确保端口可以被访问通常涉及几个步骤。即使您已经使用 firewall-cmd 添加了端口&#xff0c;但仍可能遇到无法访问的问题。以下是一些解决步骤&#xff0c;帮助您确认和解决端口无法访问的问题&#xff…...

Golang的多团队协作编程模式与实践经验

Golang的多团队协作编程模式与实践经验 一、多团队协作编程模式概述 在软件开发领域&#xff0c;多团队协作编程是一种常见的工作模式。特别是对于大型项目来说&#xff0c;不同团队间需要协同合作&#xff0c;共同完成复杂的任务。Golang作为一种高效、并发性强的编程语言&…...

DevOps 进化论:腾讯云 CODING-TM 如何助力企业敏捷转型?

在当今数字化竞争激烈的时代&#xff0c;企业的软件开发模式正经历从传统开发向敏捷开发、DevOps 转型的深刻变革。如何在保证代码质量的同时&#xff0c;加快开发、测试与交付流程&#xff0c;成为众多企业研发团队面临的核心挑战。腾讯云 CODING-TM 作为一站式 DevOps 平台&a…...

前端骨架怎样实现

前端骨架屏&#xff08;Skeleton Screen&#xff09;是一种优化页面加载体验的技术&#xff0c;通常在内容加载时展示一个简易的占位符&#xff0c;避免用户看到空白页面。骨架屏通过展示页面结构的骨架样式&#xff0c;让用户有页面正在加载的感觉&#xff0c;而不是等待内容加…...

AI前端开发的学习成本与回报——效率革命的曙光

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着各行各业。在软件开发领域&#xff0c;AI写代码工具的出现更是掀起了一场效率革命。AI前端开发&#xff0c;作为人工智能技术与前端开发技术的完美结合&#xff0c;正展现出巨大的发展潜力&#xff0c;为开发者…...

[NOIP2007 普及组] 奖学金 题解

&#xff08;一&#xff09;读懂题目 关键句&#xff1a;期末&#xff0c;每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序&#xff0c;如果两个同学总分相同&#xff0c;再按语文成绩从高到低排序&#xff0c;如果两个同学总分和语文成绩都相同&#xff0c;…...

[创业之路-297]:经济周期与股市、行业的关系

目录 一、经济周期的种类 1、短周期&#xff08;基钦周期&#xff09; 2、中周期&#xff08;朱格拉周期&#xff09; 3、长周期&#xff08;康德拉季耶夫周期&#xff09; 当下处于康波周期的哪个阶段&#xff1f; 4、建筑周期&#xff08;库涅茨周期&#xff09; 二、…...

Dav_笔记14:优化程序提示 HINTs -3

查询转换的提示 以下每个提示都指示优化程序使用特定的SQL查询转换&#xff1a; ■NO_QUERY_TRANSFORMATION ■USE_CONCAT ■NO_EXPAND ■REWRITE和NO_REWRITE ■MERGE和NO_MERGE ■STAR_TRANSFORMATION和NO_STAR_TRANSFORMATION ■事实和NO_FACT ■UNNEST和NO_UNNEST…...

递归乘法算法

文章目录 递归乘法题目链接题目详解解题思路&#xff1a;代码实现&#xff1a; 结语 欢迎大家阅读我的博客&#xff0c;给生活加点impetus&#xff01;&#xff01; 让我们进入《题海探骊》&#xff0c;感受算法之美&#xff01;&#xff01; 递归乘法 题目链接 在线OJ 题目…...

从当下到未来:蓝耘平台和 DeepSeek 应用实践的路径探索,勾勒 AI 未来新蓝图

我的个人主页 我的专栏&#xff1a;人工智能领域&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞&#x1f44d;收藏❤ 引言&#xff1a;AI 浪潮中的双引擎 在人工智能蓬勃发展的时代&#xff0c;蓝耘平台与 DeepSeek 宛如推动这一浪潮前进的双引擎。…...

非标准纸张Word文件无损转换为A4标准纸张的完整教程

在日常办公中,常会遇到需要将非标准纸张大小的Word文档(如A3、B5等)调整为A4标准尺寸的需求。直接修改Word页面设置可能导致排版错乱,而通过 Adobe Acrobat 的印前检查功能可实现内容格式无损缩放。以下是详细操作流程: 一、Word转PDF:保留原始布局 保存为PDF格式 在Word…...

Xlua中C#引用Lua变量,导致Lua侧的GC无法回收的原因及解决方法

1. 引用关系导致&#xff1a; 在 XLua 中&#xff0c;当 C# 端引用了 Lua 变量时&#xff0c;Lua 的垃圾回收器&#xff08;GC&#xff09;不会回收这些被引用的变量。这是因为 Lua 的 GC 机制是基于引用计数和标记 - 清除算法的。当 C# 端持有对 Lua 变量的引用时&#xff0c;…...

38.日常算法

1.最短无序连续子数组 题目来源 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入…...

Leetcode 算法题 9 回文数

起因&#xff0c; 目的: 数学法。 % 求余数&#xff0c; 拆开组合&#xff0c;组合拆开。 这个题&#xff0c;翻来覆去&#xff0c;拆开组合&#xff0c; 组合拆开。构建的过程。 题目来源&#xff0c;9 回文数&#xff1a; https://leetcode.cn/problems/palindrome-number…...

docker compose部署flink集群

本次部署2个jobmanager和3个taskmanager 一、部署zookeeper集群 flink使用zookeeper用作高可用 部署集群参考&#xff1a;docker compose部署zookeeper集群-CSDN博客 二、创建目录及配置文件 创建timezone文件&#xff0c;内容填写Asia/Shanghai 手动创建目录&#xff1a…...