C++ 算法:从基础到高级

C++ 算法:从基础到高级

C++ 是一种功能强大且高效的编程语言,广泛应用于系统编程、游戏开发、嵌入式系统以及高性能计算等领域。算法是程序设计的核心,掌握常用算法是成为优秀 C++ 程序员的必备技能。本文将介绍一些常用的 C++ 算法,从基础到高级,帮助读者逐步提升算法能力。

一、基础算法
1. 排序算法

排序算法是最基本的算法之一,C++ 标准库提供了多种排序算法。最常用的是 std::sort,它使用了混合排序算法(通常是快速排序和堆排序的结合)。

#include <algorithm>
#include <vector>
#include <iostream>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};std::sort(vec.begin(), vec.end());for (int n : vec) {std::cout << n << " ";}return 0;
}
2. 二分查找

二分查找是一种高效的查找算法,适用于有序数组。C++ 标准库中的 std::binary_search 可以直接使用。

#include <algorithm>
#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 5, 5, 6, 9};bool found = std::binary_search(vec.begin(), vec.end(), 5);std::cout << "Found 5: " << (found ? "Yes" : "No") << std::endl;return 0;
}
二、数据结构
1. 栈和队列

C++ 标准库提供了 std::stack 和 std::queue,它们分别实现了栈和队列的数据结构。

#include <stack>
#include <queue>
#include <iostream>int main() {std::stack<int> s;s.push(1);s.push(2);s.push(3);while (!s.empty()) {std::cout << s.top() << " ";s.pop();}std::cout << std::endl;std::queue<int> q;q.push(1);q.push(2);q.push(3);while (!q.empty()) {std::cout << q.front() << " ";q.pop();}return 0;
}
2. 哈希表

C++11 引入了 std::unordered_map,它是基于哈希表实现的键值对存储结构。

#include <unordered_map>
#include <iostream>int main() {std::unordered_map<std::string, int> umap;umap["apple"] = 1;umap["banana"] = 2;umap["orange"] = 3;for (const auto& pair : umap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
三、高级算法
1. 动态规划

动态规划是一种解决最优化问题的算法。典型的例子是斐波那契数列。

#include <iostream>
#include <vector>int fibonacci(int n) {if (n <= 1) return n;std::vector<int> dp(n + 1);dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; ++i) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];
}int main() {int n = 10;std::cout << "Fibonacci of " << n << " is " << fibonacci(n) << std::endl;return 0;
}
2. 图算法

图算法在解决路径规划、网络流等问题时非常有用。C++ 标准库没有直接提供图算法的实现,但可以使用第三方库(如 Boost Graph Library)或自己实现。下面是一个简单的深度优先搜索(DFS)示例。

#include <iostream>
#include <vector>void DFS(int v, const std::vector<std::vector<int>>& adj, std::vector<bool>& visited) {visited[v] = true;std::cout << v << " ";for (int u : adj[v]) {if (!visited[u]) {DFS(u, adj, visited);}}
}int main() {int n = 5;std::vector<std::vector<int>> adj(n);adj[0] = {1, 2};adj[1] = {0, 3, 4};adj[2] = {0};adj[3] = {1};adj[4] = {1};std::vector<bool> visited(n, false);DFS(0, adj, visited);return 0;
}
四、优化与调试
1. 代码优化

在编写高性能 C++ 代码时,优化是必不可少的。可以通过以下方法进行优化:

  • 使用合适的数据结构和算法。
  • 避免不必要的内存分配和复制。
  • 使用内联函数和 constexpr。
  • 利用编译器优化选项(如 -O2 或 -O3)。
2. 调试技巧

调试是开发过程中不可避免的一部分。常用的调试工具和方法包括:

  • 使用调试器(如 gdb)。
  • 添加日志和断点。
  • 进行单元测试和代码审查。
结论

本文介绍了从基础到高级的一些常用 C++ 算法和数据结构。掌握这些算法不仅可以提高编程效率,还能提升解决复杂问题的能力。希望本文对读者有所帮助,激发大家进一步学习和探索 C++ 编程的兴趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】phpStudy 小皮 Windows面板 存在RCE漏洞

靶场资料后台自行领取【靶场】 image-20240726092307252 PhpStudy小皮面板曝RCE漏洞&#xff0c;本质是存储型XSS引发。攻击者通过登录用户名输入XSS代码&#xff0c;结合后台计划任务功能&#xff0c;实现远程代码执行&#xff0c;严重威胁服务器安全。建议立即更新至安全版…

JAVA SE 类和对象

类和对象 类定义和使用类的定义格式 类的实例化什么是实例化 this 引用this引用的特性 对象的构造及初始化如何初始化对象构造方法概念特性 在这里插入图片描述 **注意**&#xff1a; 封装封装的概念封装扩展之包导入包中的类自定义包包的访问权限控制举例 static成员static修饰…

Spring Cloud全解析:入门指南与概览,轻松掌握微服务架构的基石

springcloud简介 微服务&#xff1f; 微服务是一种架构风格&#xff0c;将单体应用划分为小型的服务单元&#xff0c;微服务之间使用HTTP的API进行资源访问和操作&#xff0c;与SOA不同的是&#xff0c;SOA架构侧重于将每个单体应用的服务集成到ESB(消息总线)上&#xff0c;而…

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

[NOIP2001 普及组] 最大公约数和最小公倍数问题 题目描述 输入两个正整数 x 0 , y 0 x_0, y_0 x0​,y0​&#xff0c;求出满足下列条件的 P , Q P, Q P,Q 的个数&#xff1a; P , Q P,Q P,Q 是正整数。 要求 P , Q P, Q P,Q 以 x 0 x_0 x0​ 为最大公约数&#xff0c;以…

【计算机网络】TCP协议详解

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1、引言2、udp和tcp协议的异同3、tcp服务器3.1、接口认识3.2、服务器设计 4、tcp客户端4.1、客户端设计4.2、说明 5、再研Tcp服务端5.1、多进程版5.2、多线程版 5、守护进程化5.1、什么是守护进程5.2…

古籍双层PDF制作教程:保姆级古籍数字化教程

在智慧古籍数字化项目中&#xff0c;很多图书馆要求将古籍导出为双层PDF&#xff0c;并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台&#xff0c;3分钟把一个古籍书籍转化为双侧PDF。 第1步&#xff1a;上传古籍 点批量上传…

注释和关键字

注释 注释就是对代码的解释说明 单行注释 格式&#xff1a; // 多行注释 格式&#xff1a; /* */ 文档注释 格式&#xff1a; /** */ 关键字

云服务器Ubuntu18.04进行Nginx配置

云服务器镜像版本信息&#xff1a;Ubuntu 18.04 server 64bit&#xff0c;本文记录了在改版本镜像上安装Nginx&#xff0c;并介绍了Nginx配置文件目录&#xff0c;便于后面再次有需求时进行复习。 文章目录 Nginx的安装Nginx配置文件分析 Nginx的安装 1.执行下面命令进行安装…

基于FPGA的数字信号处理导航

之前闲暇的时候也看过一些数字信号处理和调制解调的原理及FPGA实现&#xff0c;不管是DDS、FIR、IIR滤波器&#xff0c;还是ASK、FSK、上变频、下变频的实现&#xff0c;都是比较简单的&#xff08;仅限于实现&#xff0c;不做深入讨论&#xff09;&#xff0c;而这些算法使用F…

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

玩转CSS&#xff1a;用ul li JS 模拟select&#xff0c;避坑浏览器不兼容。 在前端的工作中&#xff0c;经常会遇到 selcet控件&#xff0c;但我们用css来写它的样式时候&#xff0c;总是不那么令人满意&#xff0c;各种浏览器不兼容啊有没有&#xff1f; 那么&#xff0c;我…

西电网络空间安全综合953考研分享||西安电子科技大学

一、院校选择 如何选择适合自己的学校以及专业 1. 首先要对自己选择的学校有热情&#xff0c;选择自己最想去的学校 2. 其次选择在自己能力范围内努力能考上的学校&#xff0c;综合考虑地区&#xff08;不同地区公共课分数有一定的差别&#xff09;、学校&#xff08;建议跨…

关于MyBatis的缓存详解

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了对数据库的简单操作和映射。MyBatis 的缓存机制是其核心特性之一&#xff0c;它可以帮助开发者提高应用程序的性能&#xff0c;通过减少对数据库的直接访问次数来降低数据库的负载。 1. MyBatis 缓存介绍 默认缓存行…

Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选

前面完成了JuanTree组件的节点编辑和保存功能后&#xff0c;我们把精力放到节点勾选功能实现上来。**注意&#xff0c;对于组件的开发者来说&#xff0c;要充分考虑用户的使用场景&#xff0c;组件提供的多个特性同时启用时必须要工作良好。**就拿Tree组件来说&#xff0c;用户…

大模型训练为何离不开GPU?深度解析与显卡推荐

在人工智能的蓬勃发展中&#xff0c;大模型的训练成为了热门话题。然而&#xff0c;许多人还不清楚为什么训练这些庞大的模型需要GPU&#xff08;图形处理单元&#xff09;。本文将深入探讨GPU在大模型训练中的重要性&#xff0c;并推荐几款适合的显卡。 一、GPU与CPU的区别 …

Java消失的数字

题目要求 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;[9,6,4,2,3,5,7,0,1] 输出&a…

如何保证前后端交互信息不被篡改。

先说说前后端有哪些认证方式来保证&#xff1a; 基于 session 的认证方式&#xff1a;前端在用户登录成功后&#xff0c;后端会在服务器端生成一个唯一的 session ID&#xff0c;并将该 session ID 返回给前端&#xff0c;在后续的请求中&#xff0c;前端需要带上该 session ID…

【CUDA Runtime】第一个“Hello World“程序

文章目录 前言前提须知CUDA Runtime 简介核心功能优势和应用 使用CudaRuntime进行第一个"Hello world"程序创建CudaRuntime工程选择GPU函数原型参数返回值作用 获取支持Cuda的GPU信息获取支持Cuda的GPU数量获取设备属性运行展示 在GPU上分配内存把需要运行的主机内存…

scrapy出现OSError: could not get source code错误解决

出现问题如下&#xff1a; Traceback (most recent call last):File "C:\Users\admin\Desktop\crawler_scrapy_us\venv\lib\site-packages\scrapy\utils\defer.py", line 73, in mustbe_deferredresult f(*args, **kw)File "C:\Users\admin\Desktop\crawler_sc…

数据库密码实现加盐加密处理

在实际的开发中&#xff0c;我们的数据库密码一般都是明文的方式存储在数据库中&#xff0c;但是&#xff0c;这种操作非常不安全&#xff0c;容易被黑&#xff01; 那么&#xff0c;此时我们就需要对其进行加密处理&#xff0c;市面上比较常见的就是MD5加密了&#xff0c;但是…

【Linux】syscall sys_write流程摸索

这是通过tty进行摸索sys_write的流程。 在前面的博客里&#xff0c;我们可以看到基于内核C语言源代码日志打印&#xff0c;在打印的日志里边包含&#xff1a;日期&#xff0c;时间&#xff0c;当前文件所在代码目录&#xff0c;当前执行函数名&#xff0c;当前文件执行行号&am…