c++学习笔记(10)
1.
二分答案是一种常用的算法思想,用于解决一些需要枚举所有可能答案的问题。它的基本思想是将问题的答案范围缩小到一半,然后根据一定的条件判断,再将答案范围缩小到一半,直到找到正确的答案或者确定不存在正确答案为止。
下面以求解一个数的平方根为例,介绍二分答案的实现过程:
-
首先,我们需要确定答案的范围。对于求解一个数的平方根,我们可以将答案范围设为[0, x],其中x是待求的数。
-
然后,我们需要定义一个函数来判断当前的答案是否满足要求。对于求解一个数的平方根,我们可以定义一个函数check(mid),其中mid表示当前的答案,如果mid的平方小于等于x,则返回true,否则返回false。
-
接下来,我们需要使用二分答案的思想来不断缩小答案范围。具体地,我们首先取答案范围的中间值mid=(l+r)/2,然后调用check(mid)函数来判断mid是否满足要求。如果满足要求,说明答案在[l, mid]范围内,因此我们将答案范围更新为[l, mid];否则说明答案在[mid+1, r]范围内,因此我们将答案范围更新为[mid+1, r]。重复这个过程,直到找到正确的答案或者确定不存在正确答案为止。
下面是代码示例:
// 定义了一个findSqrt函数来求解一个数的平方根。
// 该函数接受一个参数x,表示待求的数。
// 在函数内部,使用二分答案的思想来不断缩小答案范围,直到找到正确的答案或者确定不存在正确答案为止。
// 最后,在主函数中读取输入数据并输出结果。#include <iostream>
using namespace std;bool check(double mid, double x) {return mid * mid <= x;
}double findSqrt(double x) {double l = 0, r = x;while (r - l > 1e-6) {double mid = (l + r) / 2;if (check(mid, x)) {l = mid;} else {r = mid;}}return l;
}int main() {double x;cin >> x;cout << findSqrt(x) << endl;return 0;
}
2.
向量数组(vector array)是一种数据结构,用于存储多个向量。在C++中,可以使用std::vector类来实现向量数组。
-
定义向量数组:
std::vector<int> arr[N];上述代码定义了一个名为arr的向量数组,其中每个元素都是一个整数类型的向量。
-
添加元素到向量数组中的特定向量:
arr[index].push_back(value);上述代码将值value添加到向量数组中索引为index的向量的末尾。
-
访问向量数组中的特定向量的元素:
int value = arr[index][position];上述代码获取向量数组中索引为index的向量中位置为position的元素的值,并将其赋给变量value。
-
遍历向量数组中的向量:
for (int i = 0; i < N; i++) { for (int j = 0; j < arr[i].size(); j++) { // 处理arr[i][j]的逻辑 } }上述代码使用两个嵌套的循环来遍历向量数组中的每个向量及其元素。外层循环控制向量的索引,内层循环控制向量中的元素位置。
-
获取向量数组的大小:
int size = arr.size();上述代码获取向量数组的大小,即包含的向量的数量。
-
清空向量数组:
arr.clear();上述代码清空整个向量数组,移除所有向量及其元素。
这些是关于C++中向量数组的基本操作和用法。通过使用向量数组,可以方便地管理和操作一组向量,实现灵活的数据存储和操作。
3.
bitset是C++标准库中的一个容器,用于处理固定大小的位序列。它可以用来存储和操作二进制数据,例如位标志、位掩码等。
-
包含头文件:
#include <bitset> -
定义
bitset对象:std::bitset<N> bitset_variable;其中
N是一个整数,表示bitset的大小,即可以存储的位数。 -
初始化
bitset对象:std::bitset<8> b1(0b11001100); // 使用二进制字面值初始化 std::bitset<8> b2("11001100"); // 使用字符串初始化 -
访问
bitset的元素:int index = 3; bool value = bitset_variable[index]; // 获取索引为index的位的值 bitset_variable.set(index, true); // 将索引为index的位设置为true bitset_variable.set(index, false); // 将索引为index的位设置为false -
对
bitset进行位运算:std::bitset<8> b1(0b11001100); std::bitset<8> b2(0b00111100); b1 &= b2; // 按位与运算 b1 |= b2; // 按位或运算 b1 ^= b2; // 按位异或运算 b1 ~= b2; // 按位取反运算 -
输出
bitset的内容:std::cout << bitset_variable << std::endl; // 输出bitset的内容
这些是关于C++中bitset的基本操作和用法。通过使用bitset,可以方便地处理位级别的数据,执行位运算和位操作。
4.
拆位思想是一种常用的位运算技巧,它通过将一个整数的二进制表示拆分成多个部分,然后对每个部分进行独立的操作,最后再将结果合并起来。这种思想在处理一些复杂的位运算问题时非常有用。
-
将一个整数的二进制表示拆分成多个部分:
int num = 23; // 二进制表示为 00010111int part1 = (num >> 4) & 0xF; // 右移4位,得到 00000101int part2 = num & 0xF; // 与0xF进行按位与运算,得到 00000111
-
每个部分进行独立的操作:
int result1 = part1 + 1; // 结果为 5int result2 = part2 - 1; // 结果为 7
-
将结果合并起来:
int finalResult = (result1 << 4) | result2; // 左移4位,得到 00010100,与result2进行按位或运算,得到 00010111
在上述代码中,我们首先将整数num的二进制表示拆分成了两个部分part1和part2。然后,我们对每个部分进行了独立的操作,得到了result1和result2。最后,我们将这两个结果合并起来,得到了最终的结果finalResult。
需要注意的是,拆位思想并不是一种通用的算法,而是针对特定的问题而设计的。在使用拆位思想时,需要根据具体的问题来选择合适的拆分方式和操作方法。
5.
unsigned是C++中用于声明无符号整数类型的关键字。它表示一个非负的整数,其取值范围为0到2^n-1,其中n是该类型的位数。
#include <iostream> int main() { unsigned int num = 4294967295; // 最大的无符号整数 std::cout << "The maximum value of an unsigned int is: " << num << std::endl; return 0;
}
需要注意的是,由于无符号整数没有符号位,因此它们的取值范围比有符号整数更大。但是,如果将无符号整数与有符号整数进行比较或运算,可能会导致意外的结果。因此,在使用无符号整数时,需要特别注意类型转换和溢出问题。
6.
深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所有边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
以下是深度优先搜索的详细解析和代码示例:
-
定义一个栈,用于存储待访问的节点。
-
将起始节点压入栈中。
-
当栈不为空时,弹出栈顶元素,访问该节点。
-
将该节点的所有邻接节点压入栈中。
-
重复步骤3和步骤4,直到栈为空。
以下是深度优先搜索的代码示例:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;// 定义了一个名为dfs的函数,用于实现深度优先搜索。
// 该函数接受三个参数:当前节点、图的邻接表表示和访问标记数组。
// 使用一个栈来存储待访问的节点,并将起始节点压入栈中。
// 然后,循环地弹出栈顶元素,访问该节点,并将其所有邻接节点压入栈中。
// 最后,输出所有被访问过的节点。void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {stack<int> s;s.push(node);while (!s.empty()) {int v = s.top();s.pop();if (!visited[v]) {cout << v << " ";visited[v] = true;for (int i = 0; i < graph[v].size(); i++) {if (!visited[graph[v][i]]) {s.push(graph[v][i]);}}}}
}int main() {vector<vector<int>> graph = {{1, 2}, {0, 3}, {0, 3, 4}, {1, 2}, {2}};vector<bool> visited(graph.size(), false);dfs(0, graph, visited);return 0;
}
7.
深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。在实际应用中,我们常常需要对搜索过程进行剪枝,以减少搜索空间和提高效率。剪枝是指在搜索过程中,对于一些不可能产生最优解的分支,直接放弃搜索,从而减少搜索空间。
以下是深度优先搜索剪枝的详细解析和代码示例:
-
定义一个栈,用于存储待访问的节点。
-
将起始节点压入栈中。
-
当栈不为空时,弹出栈顶元素,访问该节点。
-
判断该节点是否满足剪枝条件,如果满足,则跳过该节点,否则继续搜索。
-
将该节点的所有邻接节点压入栈中。
-
重复步骤3和步骤4,直到栈为空。
代码示例:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;bool isPruned(int node) {// 剪枝条件判断return false;
}void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {stack<int> s;s.push(node);while (!s.empty()) {int v = s.top();s.pop();if (!visited[v]) {cout << v << " ";visited[v] = true;for (int i = 0; i < graph[v].size(); i++) { // 判断当前节点是否满足剪枝条件,如果满足,则跳过该节点,否则继续搜索if (!visited[graph[v][i]] && !isPruned(graph[v][i])) {s.push(graph[v][i]);}}}}
}int main() {vector<vector<int>> graph = {{1, 2}, {0, 3}, {0, 3, 4}, {1, 2}, {2}};vector<bool> visited(graph.size(), false);dfs(0, graph, visited);return 0;
}
相关文章:
c++学习笔记(10)
1. 二分答案是一种常用的算法思想,用于解决一些需要枚举所有可能答案的问题。它的基本思想是将问题的答案范围缩小到一半,然后根据一定的条件判断,再将答案范围缩小到一半,直到找到正确的答案或者确定不存在正确答案为止。 下面…...
Visual Studio - 添加快捷键图标
Visual Studio - 添加快捷键图标 1. Text Editor Toolbar Options -> Add or Remove Buttons -> Customize2. Toolbars3. Commands -> Debug4. Add Command...References 1. Text Editor Toolbar Options -> Add or Remove Buttons -> Customize 2. Toolbars B…...
突破边界:Web3开启数字化社会的新纪元
引言 随着科技的不断进步和数字化社会的发展,Web3正逐渐成为了人们关注的焦点。作为新一代互联网的演进形态,Web3具有突破传统边界、实现去中心化的特点,被认为将开启数字化社会的新纪元。本文将深入探讨Web3的概念、特点、应用场景…...
docker仓库登录及配置insecure-registries的方法
docker仓库登录及配置insecure-registries的方法 这篇文章主要介绍了docker仓库登录配置insecure-registries的方法,docker客户端如果配置中添加了insecure-registary配置,就不需要在docker 客户端配置上对应证书,如果不配置要在/etc/docker/certs.d/目…...
Lambda函数与Selenium WebDriverWait类一起使用
Lambda函数是一种匿名函数,也称为内联函数或者lambda表达式。它们在Python中用于创建简短的、一次性的函数。Lambda函数通常用于在代码中传递函数作为参数,或者在需要一个简单的函数,但不想正式定义一个函数的情况下使用。 Lambda函数的特点…...
V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆
未来,VR元宇宙平台可能会呈现出以下发展趋势和可能性: 全面融合现实与虚拟世界: VR元宇宙平台将更加无缝地融合现实世界和虚拟世界,用户可以在虚拟环境中进行各种活动,与现实世界进行互动,并且体验到更加逼…...
sox命令用法
play input.wav 播放音频 sox input.wav -n stat 查看音频文件信息 soxi input.wav 查看音频文件信息input sox input.wav -n stat -v 不失真最大调整量 sox -v 0.8 input.wav output.wav 调整音量0.8,(大于1为扩大,小于1为缩小) sox *.wav *…...
Android kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能二
1.前言 在进行app应用开发中,在实现某些功能中要求实现悬浮窗功能,分为应用内悬浮窗 ,全局悬浮窗和 锁屏页面悬浮窗功能 等,接下来就来实现这些悬浮窗全屏功能,首选看下第二部分功能实现 2.kotlin实现锁屏页面悬浮窗全屏功能二分析 悬浮窗是属于Android系统的一种浮动窗…...
[数据结构]二叉树与递归OJ
上回我们手撕了一棵二叉树,并且通过递归完成了遍历,这回我们将深入理解用递归解决相关的二叉树问题,数量使用分治的思想. 上回的代码: #include<stdio.h> #include<stdlib.h> typedef struct BinTreeNode {struct BinTreeNode* left;struct BinTreeNode* right;i…...
vue iframe实现父页面实时调用子页面方法和内容,已解决
父页面标签添加鼠标按下事件 父页方法中建立iframe通信 实时调用子页面方法 实时更改子页面文本内容...
Spring Cloud Gateway教程
1 微服务网关概述 Spring Cloud Gateway是在 Spring 生态系统之上构建的API网关服务,旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway主要功能: 反向代理认证鉴权流量控制熔断日志监控 2 Spring Cloud Gateway三…...
解码新时代内存架构:探秘数据在内存中的灵动驻足
欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 随着信息技术的飞速发展,我们身处一个数据爆炸的时代。数据的处理和存储方式正日益成为技术革新的重要领域。在新时代的…...
前端基础篇-前端工程化 Vue 项目开发流程(环境准备、Element 组件库、Vue 路由、项目打包部署)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 环境准备 1.1 安装 NodeJs 1.2 验证 NodeJs 环境变量 1.3 配置 npm 的全局安装路径 1.4 切换 npm 的淘宝镜像( npm 使用国内淘宝镜像的方法(最新) ) 1.5 查看镜像…...
【通用人工智能AGI元年-各领域的精彩AI/LLM(持续更新)】
AI元年弄潮儿 通用人工智能AGI时代大模型LLM集成平台:Poe语言大模型:ChatGPT音乐:Suno文生图: [Stable Diffusion整合包](https://www.bilibili.com/video/BV1iM4y1y7oA/?spm_id_from333.999.0.0&vd_source260c69efcf1f56243…...
【微服务】设计弹性微服务架构模式
目录 模式#1 — 超时模式#2 — 重试模式#3— 隔离模式#4— 断路器模式#5 — 冗余推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战在微服务架构中,服务通常相互协作以提供业务用例。这些服务可能在可用性、可伸缩性、弹性等方面具有…...
Websocket + Vue使用
这里有一篇文档可以参考一下> 闪现 POM文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.0</version> </dependency> WebSocketConf…...
AI程序员革命:探析Devin的登场与编程未来
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
vue 控制窗口禁止缩放,已解决
注意:不是浏览器窗口禁止缩放 1.vue框架中,index.html文件head标签中加上内容 <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalable0"><script>document.addEventListen…...
【黑马头条】-day01环境搭建SpringBoot-Cloud-Nacos
文章目录 1 环境搭建及简介2 项目介绍2.1 应用2.2 业务说明2.3 技术栈2.4 收获2.5 大纲 3 Nacos准备3.1 安装Nacos 4 初始工程搭建4.1 环境准备4.1.1 导入项目4.1.2 设置本地仓库4.1.3 设置项目编码格式 4.2 全局异常4.2.1 自动装配 4.3 工程主体结构 5 登录功能开发5.1 需求分…...
HTML发展史
为什么要讲 HTML 发展史呢? 唐太宗告诉我们: 以铜为镜,可以正衣冠;以史为镜,可以知兴替;以人为镜,可以明得失。 那了解了 HTML 的发展史,可以知道什么呢? 答案是兼容 国内在 淘宝…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
