蓝桥云课ROS学习C++教程cpp-geeksforgeeks版本
教程
网上教程很多,都可以在蓝桥云课ROS中复习。
#include <bits/stdc++.h>
using namespace std;int main() {// Creating a map of integer keys// and string valuesmap<int, string> m {{1, "Geeks"},{2,"For"}, {3,"Geeks"}};for (auto& p : m)cout << p.first << " " << p.second<< "\n";return 0;
}
参数-std=c++11。
代码解析:C++ STL map
容器使用示例
#include <bits/stdc++.h> // 包含C++标准库的所有头文件(不推荐在生产代码中使用)
using namespace std; // 使用标准命名空间,避免每次都要写std::int main() {// 创建一个整数键、字符串值的map容器// 使用初始化列表直接初始化mapmap<int, string> m {{1, "Geeks"}, // 键值对1: 1 -> "Geeks"{2, "For"}, // 键值对2: 2 -> "For"{3, "Geeks"}}; // 键值对3: 3 -> "Geeks"// 使用基于范围的for循环遍历map// auto& p会自动推导为pair<const int, string>类型for (auto& p : m) {// 输出每个键值对// p.first是键(int类型)// p.second是值(string类型)cout << p.first << " " << p.second << "\n";}return 0; // 程序正常结束
}
cpp
#include <bits/stdc++.h> // 包含C++标准库的所有头文件(不推荐在生产代码中使用) | |
using namespace std; // 使用标准命名空间,避免每次都要写std:: | |
int main() { | |
// 创建一个整数键、字符串值的map容器 | |
// 使用初始化列表直接初始化map | |
map<int, string> m {{1, "Geeks"}, // 键值对1: 1 -> "Geeks" | |
{2, "For"}, // 键值对2: 2 -> "For" | |
{3, "Geeks"}}; // 键值对3: 3 -> "Geeks" | |
// 使用基于范围的for循环遍历map | |
// auto& p会自动推导为pair<const int, string>类型 | |
for (auto& p : m) { | |
// 输出每个键值对 | |
// p.first是键(int类型) | |
// p.second是值(string类型) | |
cout << p.first << " " << p.second << "\n"; | |
} | |
return 0; // 程序正常结束 | |
} |
详细解析:
- 头文件包含:
#include <bits/stdc++.h>
是一个非标准的GCC头文件,它包含了C++标准库的所有头文件。虽然方便但不推荐在生产代码中使用,因为它会显著增加编译时间。更好的做法是只包含需要的头文件,如#include <iostream>
和#include <map>
。
- 命名空间:
using namespace std;
允许直接使用标准库中的名称(如cout
、map
等),而不需要写std::cout
。
- map容器:
map<int, string>
声明了一个关联容器,键类型为int
,值类型为string
。- map会自动按键排序(默认升序),且键是唯一的。
- 初始化:
- 使用初始化列表直接初始化map,创建了三个键值对:
- 1 -> "Geeks"
- 2 -> "For"
- 3 -> "Geeks"
- 使用初始化列表直接初始化map,创建了三个键值对:
- 遍历map:
for (auto& p : m)
是C++11引入的基于范围的for循环,auto& p
会自动推导为pair<const int, string>&
类型。p.first
访问键,p.second
访问值。
- 输出:
- 程序会输出:
1 Geeks
2 For
3 Geeks
- 输出是按键升序排列的,因为map默认使用
less<int>
作为比较函数。
- 程序会输出:
注意事项:
- 在实际开发中,建议使用更具体的类型声明而不是
auto
,以提高代码可读性。 - 如果不需要修改元素,可以使用
const auto&
来避免不必要的拷贝。 - 对于大型项目,最好明确包含所需的头文件而不是使用
bits/stdc++.h
。
参考:
教程在这里:https://www.geeksforgeeks.org/cpp-tutorial/云课在这里:https://www.lanqiao.cn/courses/854
本文介绍了C++编程语言的基础知识和ROS机器人开发框架的学习路径。主要内容包括:1. C++基础语法和STL容器使用示例(如map容器);2. C++面向对象特性与ROS开发的结合点;3. 系统化的学习路径设计(分4个阶段);4. 实践项目建议(如导航算法、机器视觉等);5. 效率提升策略(理论实践结合、工具利用等)。文章强调通过项目实战将C++特性与ROS开发深度结合,并提供详细的学习资源和时间管理建议。
C++ 教程 | 学习 C++ 编程
最后更新时间:2025 年 5 月 17 日
C++ 是一种流行的编程语言,最初作为 C 语言的扩展开发而来,引入了面向对象编程(OOP)范式。自那时起,它已成为许多现代技术的基础,如游戏引擎、网页浏览器、操作系统、金融系统等。
C++ 的特性
为什么学习 C++?
C++ 通常被作为有志程序员的入门语言,但它的价值远不止于此:
- 广泛应用:C++ 是操作系统、嵌入式系统、图形用户界面(GUI)以及高频交易(HFT)系统开发中最常用的语言之一。
- 支持多级编程:既支持低级编程(如手动内存管理),也支持高级编程(如面向对象编程)。
- 语法相似性:与 C、Java 和 C# 的语法相似,便于开发者在不同语言间切换。
- 执行速度快:在高级语言中,C++ 的执行速度名列前茅,这在竞赛编程或高性能应用中至关重要。
第一个 C++ 程序
在学习 C++ 之前,让我们通过一个简单的程序快速了解这门语言。以下是一个输出“Hello World”的程序:
cpp
#include <iostream> | |
using namespace std; | |
int main() { | |
cout << "Hello World!"; | |
return 0; | |
} |
输出:
Hello World! |
C++ 教程概述
本 C++ 教程提供了全面、系统的学习指南,适合初学者和有经验的程序员。每个主题都通过实际代码示例和实际应用场景进行清晰讲解。
C++ 基础
1. 概述
- C++ 简介
- 特性
- 有趣的事实
- 设置开发环境
2. 基础语法
- Hello World 程序
- 注释
- 标记(Tokens)
- 标识符
- 关键字
- 变量
- 数据类型
- 字面量(Literals)
- 常量
- 运算符
- 输入输出
3. 控制流
- if 语句
- if-else 语句
- if-else-if 阶梯
- 嵌套 if-else 语句
- switch 语句
- 跳转语句
- for 循环
- while 循环
- do…while 循环
4. 函数
- 函数定义与调用
- 参数传递
- 默认参数
- 递归
- 内联函数
5. 指针
- 指针简介
- 指针的应用
- 指针运算
- 悬垂指针、空指针、野指针
- 引用
- 指针 vs 引用
6. 数组
- 数组简介
- 指向数组的指针
- 数组作为函数参数
- 数组大小
- 多维数组
7. 字符串
- 字符串简介
- 字符串数组
- 字符串函数
- 字符串连接
- 子字符串
8. 结构体与联合体
- 结构体简介
- 指向结构体的指针
- C 结构体 vs C++ 结构体
- 联合体简介
- 位域
- 枚举
- typedef
9. 动态内存管理
- 动态内存分配
- new 和 delete 运算符
- new vs malloc(),delete vs free()
- 内存泄漏
- 静态内存 vs 动态内存
C++ 面向对象编程(OOP)
1. 类与对象
- 类定义
- 对象创建
- 访问修饰符
- 友元类与友元函数
- 构造函数
- 析构函数
- 浅拷贝与深拷贝
- this 指针
2. 封装与抽象
- 封装
- 抽象
3. 多态性
- 函数重载
- 函数重写
- 继承
- 多继承
- 虚函数
C++ 模板
- 模板简介
- 模板特化
- using 关键字
C++ 标准模板库(STL)
- STL 简介
- 算法
- 容器
- Vector
- Pair
- Set
- Map
- Stack
- Queue
- Priority Queue
- Deque
- List
- Forward List
- Bitset
- 迭代器
C++ 异常处理
- 异常处理简介
- 使用类的异常处理
- 栈展开(Stack Unwinding)
- 用户自定义异常
C++ 文件与流
- 文件与流简介
- 输入输出重定向
C++ 预处理器
- 预处理器简介
- 预处理器指令
- #include 指令
- #define 指令
- 条件预处理器
高级 C++
- 命名空间
- 多线程
- 智能指针
- 函数回调
- 信号处理
- 泛型编程
C++ 面试题
- Top 50 C++ 面试题与答案
- Top C++ STL 面试题与答案
- 30 个 OOP 面试题与答案
- Top C++ 异常处理面试题与答案
C 与 C++ 的区别
特性 | C | C++ |
---|---|---|
类型 | 过程式编程语言 | 支持过程式和面向对象编程的中间级语言 |
编程范式 | 仅支持过程式编程 | 支持多范式:过程式、面向对象和泛型编程 |
数据安全性 | 安全性较低,仅支持过程式编程 | 更安全,支持封装等特性 |
类与对象 | 不支持类与对象 | 支持类与对象,实现面向对象编程 |
内存管理 | 手动内存管理(malloc/free) | 支持手动和自动内存管理(new/delete) |
函数重载 | 不支持函数重载 | 支持函数重载 |
异常处理 | 不支持异常处理 | 支持异常处理(try/catch/throw) |
命名空间 | 无命名空间功能 | 支持命名空间,避免名称冲突 |
输入输出函数 | 使用 scanf/printf | 使用 cin/cout 等面向对象输入输出流 |
继承 | 不支持继承 | 支持继承,允许类继承属性和方法 |
模板支持 | 不支持模板 | 支持模板,实现泛型编程 |
动态绑定 | 不支持动态绑定 | 支持动态绑定(虚函数) |
头文件扩展名 | 使用 .h 扩展名 | 使用 .hpp 或 .h 扩展名 |
兼容性 | 通常仅限于 C 编程 | 向后兼容 C,允许 C 代码在 C++ 程序中运行 |
应用领域 | 主要用于系统编程、嵌入式系统和底层编程 | 广泛用于游戏开发、GUI 应用、实时仿真和系统/软件开发 |
互动学习 C++
如果你觉得内容过于复杂,可以探索免费的 C++ 编程语言指南,这是一个自学的课程。它从语言的基本组件开始讲解,并在每个概念后提供测验和实践问题,帮助你掌握知识。此外,课程末尾还提供最终评估测试,检验你的学习成果。
C++ 相关职业与岗位
根据 Statista 的报告,C++ 在 2024 年将是仅次于 JavaScript、Java 和 C# 的最常用编程语言之一。在常用语言列表中,23% 的开发者使用 C++。许多公司都在寻找熟练的 C++ 开发者,以下是一些示例公司:
- BOSCH Group
- Capgemini
- Amazon
- Microsoft
- Accenture
- IBM
- Meta
- Adobe
- Apple
- Mozilla
- Wipro
- Infosys
希望这个中文版的 C++ 教程能帮你更好地理解和学习这门语言!
在学习C++基础的同时掌握ROS,需要制定系统化的学习路径,将语言特性与机器人开发实践深度结合。以下是分阶段的高效学习方案:
一、C++基础学习阶段(0-3个月)
- 核心语法掌握
- 数据类型与控制流:重点学习整型、浮点型、条件语句(if-else)、循环结构(for/while)等,这是后续ROS节点开发的基础。
- 面向对象编程:深入理解类与对象、继承、多态等概念,为后续ROS中的自定义消息类型和服务定义打下基础。
- STL容器与算法:掌握vector、map、list等容器,以及sort、find等算法,这些在ROS数据处理中高频使用。
- 实践项目
- 实现简单控制台程序,如计算器、学生信息管理系统,强化语法和逻辑能力。
- 开发小型图形界面程序(如使用Qt),为后续ROS可视化工具(RViz)的学习做准备。
二、ROS基础学习阶段(1-2个月)
- 环境搭建与核心概念
- 安装ROS(推荐Noetic或Humble版本),配置开发环境。
- 掌握节点(Node)、话题(Topic)、服务(Service)、消息(Message)等核心概念,理解ROS的分布式通信机制。
- 工具与通信机制
- 学习RViz可视化工具、rqt工具集,掌握数据可视化与调试技巧。
- 通过发布/订阅模型实现节点间通信,编写简单的发布者和订阅者节点。
- 实践项目
- 实现键盘控制小车移动,熟悉ROS节点开发和话题通信。
- 开发激光雷达建图程序,掌握传感器数据处理和SLAM技术基础。
三、C++与ROS深度结合阶段(2-3个月)
- 高级功能开发
- 路径规划与导航:使用ROS Navigation Stack实现机器人自主导航,结合C++编写路径规划算法(如A*、Dijkstra)。
- 机器视觉集成:通过OpenCV和ROS实现目标检测与跟踪,编写C++代码处理图像数据。
- 机械臂控制:使用MoveIt!框架和URDF建模,结合C++实现机械臂的运动规划与抓取任务。
- 项目实践
- 开发自动驾驶仿真系统,集成传感器数据、路径规划和决策控制模块。
- 实现多机器人协同任务,如编队控制或协作搬运,掌握ROS多机通信和C++并发编程。
四、效率提升策略
- 理论与实践结合
- 每学习一个C++特性(如模板、智能指针),立即在ROS项目中应用,如编写自定义消息类型的序列化代码。
- 通过ROS官方教程(如“21讲入门视频”)和开源项目(如Autoware、Apollo)学习最佳实践。
- 工具与资源利用
- 使用蓝桥云课等在线平台,结合实验和社区讨论,快速解决开发中的问题。
- 参考《C++ Primer》《ROS机器人编程》等经典书籍,系统化提升理论水平。
- 时间管理与计划制定
- 制定每日学习计划,如“上午学习C++多线程,下午开发ROS多机器人通信节点”。
- 定期复习和总结,通过博客或技术分享加深理解。