C++----STL(vector)
vector的介绍
vector的文档介绍:cplusplus.com/reference/vector/vector/
1.基本概念
- 简单来说,vector是表示可以改变大小的数组的顺序容器。
- 使用连续的存储位置来存储元素,因此可以通过常规指针的偏移量来高效访问。
2.内部机制
- vector内部使用动态分配的数组来存储元素。
- 插入新元素时,数组可能需要重新分配以增大尺寸,这是一项相对昂贵的任务。为避免频繁重新分配,vector可能会分配一些额外的存储空间以适应可能的增长。
- vector的实际容量可能大于存储元素所需的空间(即大小)。
3.内存管理
- 库采用不同的增长策略来平衡内存使用和重新分配。
- 重新分配通常只在大小以对数增长间隔发生时进行,以提供摊还常数时间复杂度的插入操作(如push_back)。
- 与数组相比,向量消耗更多内存,但具备管理和动态增长存储的能力。
4.vector的原型
vector的使用
迭代器
begin()
- 功能说明:返回一个指向vector第一个元素的迭代器。
- 注意:有可读可写和只读两种迭代器。
rbegin()
- 功能说明:返回一个指向vector最后一个元素的迭代器。
- 同样有可读可写和只读两种。(下面讲解的迭代器都如此)
end()
- 功能说明:返回一个指向vector最后一个元素之后位置的迭代器。
rend()
- 功能说明:返回一个指向vector第一个元素之前位置的反向迭代器。
构造函数
1.使用填充构造
//原型:explicit vector (size_type n, const value_type& val = value_type(),const allocator_type& alloc = allocator_type());
vector<int> v1(10, 1);//创建一个包含10个整数的vector,每个整数初始化为1
vector<string> v2(10, "***");//创建一个包含10个字符串的vector,每个字符串初始化为"***"
2.使用迭代器范围构造
//原型:template <class InputIterator> vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());
vector<int> v3(v1.begin(), v1.end());//使用v1的迭代器范围构造v3string str("hello world");
vector<char> v4(str.begin(), str.end());//使用字符串string的迭代器范围构造字符vector v4int a[] = {16, 2, 77, 29};
vector<int> v5(a, a + 4); // 使用数组a的迭代器范围构造v5
补充:配合sort函数的使用进行升序和降序排序
sort(v5.begin(), v5.end()); // 使用默认比较器(less<int>)对v5进行升序排序
sort(v5.begin(), v5.end(), greater<int>()); // 使用greater<int>比较器对v5进行降序排序
sort(v5.rbegin(),v5.rend()); // 使用反向迭代器对v5进行降序排序
sort(str.begin(), str.end()); // 对字符串str进行字典序排序
sort(a, a + 4); // 对数组a进行排序
容量相关的操作
size()
- 功能说明:返回vector中当前元素的个数。
max_size()
- 功能说明:返回vector中能容纳的最大元素个数。
capacity()
- 功能说明:返回vector在当前情况下能容纳的元素个数。
reserve()
- 功能说明:扩容。
- 注意:reserve不改变vector的大小(即size()的值),也不初始化新分配的内存。
- 易错展示:
vector<int> v1; v1.reserve(10); for (size_t i = 0; i < 10; i++) {v1[i] = i; // 错误:v1.size()仍为0,访问v1[i]是未定义行为。 }
- 正确做法:
vector<int> v1; v1.reserve(10); for (size_t i = 0; i < 10; i++) {v1.push_back(i); // 正确:使用push_back添加元素并初始化。 }
resize()
- 功能说明:扩容+初始化
vector<int> v1; v1.resize(10); // 改变大小为10,新元素初始化为0(对于int类型)。 for (size_t i = 0; i < 10; i++) {v1[i] = i; // 正确:v1的大小已经是10。 }
empty()
- 功能:检查vector是否为空。如果vector的大小为0,则返回true;否则返回false
shrink_to_fit()
- 功能:请求移除vector中多余的容量。调用后,vector的容量将被调整为当前大小(即size()的值),前提是这不会增加内存分配的总大小。
元素访问
operator[]
- 功能:通过索引访问vector中的元素。
- 注意:不进行边界检查,如果索引超出范围,则行为未定义,可能导致程序崩溃或数据损坏)
vector<int> v = {1, 2, 3};int first = v[0]; // 访问第一个元素,值为1。
at()
- 功能:通过索引访问vector中的元素。
- 与operator[]不同,at会进行边界检查。如果索引超出范围,则抛出std::out_of_range异常。
vector<int> v = {1, 2, 3};int second = v.at(1); // 访问第二个元素,值为2。
data()
- 功能说明:返回指向vector中第一个元素的指针(类型为T*,其中T是vector存储的元素类型)。如果vector为空,则返回空指针。
- 类似于string中的c_str()方法,但data返回的是可修改的指针。
vector<int> v = {1, 2, 3};int* ptr = v.data();cout << ptr[0] << " " << ptr[1] << " " << ptr[2] << endl; // 输出:1 2 3
修改操作
push_back()
- 功能:在vector末尾添加一个元素。
pop_back()
- 功能:移除vector末尾的元素.
insert()
- 功能:在指定位置插入一个或多个元素。
int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };vector<int> v1(a, a + sizeof(a)/sizeof(int));// 头插 v1.insert(v1.begin(), 100);
erase()
- 功能:移除指定位置的元素或一段元素。
int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };vector<int> v1(a, a + sizeof(a)/sizeof(int));// 头删v1.erase(v1.begin());// 删除第3个数据v1.erase(v1.begin() + 2);
注意:std::vector
中使用erase
和insert
后迭代器失效的情况
在C++的STL(标准模板库)中,vector
是一个动态数组,其内存可以重新分配和移动。因此,当你对vector
进行erase
或insert
,可能会导致指向vector
元素的迭代器失效。失效的迭代器不能再被用来访问vector
中的元素,因为这样做会导致未定义行为。
下面的代码例子,展示了在std::vector
中使用erase
后迭代器失效的情况:
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec = { 1, 2, 3, 4, 5 };// 创建一个指向vector中第三个元素的迭代器auto it = vec.begin() + 2; // 指向3// 输出迭代器指向的值cout << "Before erase: " << *it << endl; // 输出: 3// 删除迭代器指向的元素vec.erase(it);// 此时it已经失效for (auto e : vec) {cout << e << " ";}cout << endl;// 下面的代码是未定义行为,因为it已经失效// cout << "After erase (undefined behavior): " << *it << endl; // 不要这样做return 0;
}
正确做法:
#define _CRT_SECURE_NO_EARNINGS 1
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec = { 1, 2, 3, 4, 5 };// 创建一个指向vector中第三个元素的迭代器auto it = vec.begin() + 2; // 指向3// 输出迭代器指向的值cout << "Before erase: " << *it << endl; // 输出: 3// 删除迭代器指向的元素it = vec.erase(it);// 我们可以获取删除元素后的下一个元素for (auto e : vec) {cout << e << " ";}cout << endl;cout << "After erase (undefined behavior): " << *it << endl; // 此时的it指向被删除的位置的下一个元素4return 0;
}
下面的代码例子,展示了在std::vector
中使用insert
后迭代器失效的情况:
#define _CRT_SECURE_NO_EARNINGS 1
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec = { 1, 2, 3, 4, 5 };vector<int>::iterator it = vec.begin() + 2;cout << "it: " << *it << endl;// 插入新元素vec.insert(vec.begin(), 10); // 在开头插入10for (auto e : vec) {cout << e << " ";}cout << endl;// 所有指向vec元素的迭代器(包括end()之前的迭代器)都可能失效// 下面的代码同样是未定义行为,因为之前的迭代器(即使它们没有直接指向被插入的位置)也可能不再有效// cout << "After insert (undefined behavior): " << *it << endl; // 这是错误的return 0;
}
正确做法:
#define _CRT_SECURE_NO_EARNINGS 1
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec = { 1, 2, 3, 4, 5 };vector<int>::iterator it = vec.begin() + 2;cout << "it: " << *it << endl;// 插入新元素vec.insert(vec.begin(), 10); // 在开头插入10for (auto e : vec) {cout << e << " ";}cout << endl;// 正确的做法是重新获取迭代器it = vec.begin() + 2;cout << "After insert (undefined behavior): " << *it << endl; return 0;
}
swap()
- 功能:交换两个vector的内容。
clear()
- 功能:移除vector中的所有元素,使其变为空容量。
assign()
- 功能:清楚vector中的值,并用新值重新赋值。
v1.assign(10, 1); // 将v1重新赋值为10个1
补充:find在 vector 中的应用
vector中的find:vector不像string在成员函数中直接提供了find(),而是通过<algorithm>头文件中的find函数,用于查找元素的位置。
#include<iostream>
#include<algorithm>
using namespace std;int main()
{int a[] = { 16,2,77,29,3,33,43,3 };vector<int> v1(a, a + sizeof(a)/sizeof(int));auto pos = find(v1.begin(), v1.end(), 3); // 在v1中查找元素3// 删除第3个数据v1.erase(v1.begin()+2);return 0;
}
迭代器失效问题:
#include<iostream>
#include<algorithm>
using namespace std;int main()
{int a[] = { 16,2,77,29,3,33,43,3 };vector<int> v1(a, a + sizeof(a)/sizeof(int));auto pos = find(v1.begin(), v1.end(), 3); // 在v1中查找元素3// 删除所有的3 -- 涉及迭代器失效!后面解决while(pos != v1.end()){v1.erase(pos);pos = find(v1.begin(), v1.end(), 3); // 可能导致无限循环,因为pos可能已失效}return 0;
}
原因:vector在insert或erase操作后,可能会重新分配内存(尤其是当容量不足时),导致所有指向该vector的迭代器失效。
解决:
while((pos = find(v1.begin(), v1.end(), 3)) != v1.end()){v1.erase(pos);}
相关文章:
C++----STL(vector)
vector的介绍 vector的文档介绍:cplusplus.com/reference/vector/vector/ 1.基本概念 简单来说,vector是表示可以改变大小的数组的顺序容器。使用连续的存储位置来存储元素,因此可以通过常规指针的偏移量来高效访问。 2.内部机制 vector…...
springboot项目适配电科金仓数据库
又接到了信创适配任务,话不多说,直接开始干货 首先安装一下电科金仓的数据库,直接官网下,对应的授权也下90天的专业版,客户肯定是整个采购,365天的开发版本连接数有限制 KES相关下载地址:电科金仓-成为世界卓越的数据库产品与服务提供商 安装就不做赘述了 启动数据库…...
C# 动态创建Label和ComboBox控件并修改Text获取Text
背景:在做项目的时候可能需要根据一定数量创建某些控件并修改其属性,本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; …...
HP 笔记本重新安装 Windows 11 无法启动
相信你搜到这篇文章的时候, 你已经看过了网上各种关于如何在 HP 笔记本电脑上安装 Windows 11 的文章。你遇到的问题肯定不是网上那些文章讲的那么简单的问题。你遇到的一定不是你不懂如何安装 Windows,不懂如何对硬盘分区等等小白问题。 问题描述 问…...
BUUCTF_Web( XSS COURSE 1)xss
XSS即跨站脚本攻击(Cross-Site Scripting),是一种常见的网络安全漏洞. 定义 XSS攻击指攻击者在目标网站中注入恶意脚本,当用户访问该网站时,浏览器会执行这些恶意脚本,从而导致用户信息泄露、被控制等安全问…...
STM32补充——IAP
0 前置知识: FLASH相关内容:前往STM32补充——FLASH STM32三种烧录方式(看看就行): 1.ISP:In System Programming(在系统编程) 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...
APP加固的那些事
APP加固是保护APP代码逻辑的重要手段,通过隐藏、混淆、加密等操作提高软件的逆向成本,降低被破解的几率,保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法,以及处理安装出现问题的情况和资源文件加固策略选择。 引…...
数据分析 基础定义
一、大数据的定义 数据分析是基于商业等目的,有目的的进行收集、整理、加工和分析数据,提炼有价值信息的过程。 大数据分析即针对海量的、多样化的数据集合的分析 大数据分析是一种利用大规模数据集进行分析和挖掘知识的方法。随着互联网、社交媒体、移动…...
PyTorch广告点击率预测(CTR)利用深度学习提升广告效果
目录 广告点击率预测问题数据集结构广告点击率预测模型的构建1. 数据集准备2. 构建数据加载器3. 构建深度学习模型4. 训练与评估 总结 广告点击率预测(CTR,Click-Through Rate Prediction)是在线广告领域中的重要任务,它帮助广告平…...
嵌入式入门(二)-STM32CubeMX项目开发
使用STM32CubeMX创建项目 本文使用STM32CubeMX模拟器创建一个嵌入式项目的详细流程。 New Project 根据型号搜索 搜索型号: STM32F103C8T6 启动项目 选择STM32F103C8T6后点击 Start Project 配置时钟 切换到 Clock Configuration 修改HCLK -->72MHZ 修改Input fr…...
MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍
MATLAB在绘图时,设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…...
Java菜鸟养成计划(java基础)--java运算符
java中的运算符 1、java中的运算符1.1 、 、-、 * 、/ 、 %1.2 、、-、 *、/、%1.3 、、--【自增\自减运算符】1.4、>、 <、 > 、< 、 、! 、! 1.5、&&、||、|、&1.6、&、|、~、^1.7、>> 、 <<、>>>位运算1.8、?:三目运算符…...
学习笔记——动态规划
递推 1.递推和动态规划有什么关系? 递推问题包括动态规划,动态规划一定是递推,递推不一定是动态规划。 动态规划是一种决策性的问题,是在状态中做最优决策的一种特殊递推算法,通常的问法包括求最大最小值等ÿ…...
蓝桥杯备考:红黑树与map和set
搜索二叉树 我们三种树只了解原理,不写代码,因为我们竞赛不做要求,只是为了使用set和map做铺垫 原理记不住,没关系,我们只要会各种操作的时间复杂度 二叉搜索树的定义 1若左子树非空,左子树所有结点的权…...
第二届生成式人工智能与信息安全国际学术会议(GAIIS 2025)
在线投稿: 学术会议-学术交流征稿-学术会议在线-艾思科蓝 【征文主题】(包括但不限于) 深度学习 自然语言处理 算法应用 计算机视觉 视觉识别 模式识别 强化学习 生成对抗网络 生成建模技术 语言预训练 视觉预训练 联合预训练…...
后端面试题分享第一弹(状态码、进程线程、TCPUDP)
后端面试题分享第一弹 1. 如何查看状态码,状态码含义 在Web开发和调试过程中,HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具: 在大多数浏览器中,您可以通过按下 F12 键或右键单击页面并选择“检查…...
Python 常用运维模块之OS模块篇
Python 常用运维模块之OS模块篇 OS 模块获取当前工作目录更改当前工作目录返回当前目录路径返回上一级目录路径递归生成目录路径删除目录创建目录删除目录列出特定目录下文件和子目录删除某个特定文件重命名某个文件获取某个文件/目录的信息输出目录路径分隔符输出文件行终止符…...
前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!
引言 时光飞逝,2024年已经来临,回顾过去一年,科技的迅猛进步简直让人目不暇接。 在人工智能(AI)越来越强大的今天,我们不再停留在幻想阶段,量子计算的雏形开始展示它的无穷潜力,Web …...
HTML语言的数据结构
HTML语言的数据结构 引言 HTML(超文本标记语言)是构建网页的标准语言。尽管HTML本身不是一种编程语言,它为我们提供了一种结构化的信息表示方法,使得网页内容能够有序地展现给用户。HTML的核心在于其标记(标签&#…...
怎么创建一个能在线测试php的html5网页?
代码示例: 一、搭建服务器环境 首先,你需要在服务器上搭建 PHP 运行环境。如果你使用的是 Linux 服务器,可以使用 Apache 或 Nginx 作为 Web 服务器,并安装 PHP 解释器。对于 Windows 服务器,可以使用 WAMP(…...
docker安装elk6.7.1-搜集nginx-json日志
docker安装elk6.7.1-搜集nginx-json日志 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 0.规划 192.168.171.130 nginxfilebeat 192.168.171.131 …...
常见的社交媒体平台有哪些?
社交媒体平台有哪些?在跨境电商和全球营销的过程中,海外社交媒体平台是提高品牌曝光率的重要工具。为了有效管理多个平台的账户,并防止账户之间的关联问题,OKBrow指纹指纹浏览器凭借其强大的多账户管理、防关联技术和隐私保护功能…...
nslookup在内网渗透的使用
1. 什么是 nslookup? nslookup(Name Server Lookup)是一个用于查询 DNS(域名系统)记录的命令行工具。通过该工具,用户可以查询域名的解析结果,例如获取某个域名对应的 IP 地址或查找域名的相关记…...
Linux:修改用户名
Linux:修改用户名 0. 注意事项1.创建并切到临时用户tempuser2.更改用户名3.删除临时用户tempuser 更多内容:XiaoJ的知识星球 在Ubuntu系统中,更改用户名。 0. 注意事项 备份重要数据:在更改用户名之前,建议备份重要数…...
IP协议特性
在网络层中,最重要的协议就是IP协议,IP协议也有两个特性,即地址管理和路由选择。 1、地址管理 由于IPv4地址为4个字节,所以最多可以支持42亿个地址,但在现在,42亿明显不够用了。这就衍生出下面几个机制。…...
开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)
在 WSL 环境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网:https://nodejs.org/zh-cn/download 点击【下载】,选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...
14_音乐播放服务_字典缓存避免重复加载
首先在游戏根入口下创建空节点 F2重命名为BGAudio 作为播放 背景音乐的对象 在BGAudio对象上挂载组件 AudioSource 关掉PlayOnAwake 因为我们需要通过代码来控制音效 音量大小设置为0.5 Ctrl d 再复制一份背景播放对象BGAudio 重命名为UIAudio 作为UI窗口操作的播放对象 创建…...
pgsql中处理数组类型字段
1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...
新年好(Dijkstra+dfs/全排列)
1135. 新年好 - AcWing题库 思路: 1.先预处理出1,a,b,c,d,e到其他点的单源最短路,也就是进行6次Dijkstra 2.计算以1为起点的这6个数的全排列,哪种排列方式所得距离最小,也可以使用dfs 1.Dijkstradfs #define int long longusing …...
vscode导入模块不显示类型注解
目录结构: utils.py: import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…...
Stable diffusion 都支持哪些模型
Stable Diffusion 支持多种模型,主要包括以下几类: 官方基础模型: SD 1.x 系列(如 Stable Diffusion 1.4、1.5):这是最经典的模型,适合多种通用场景,使用简单且易于上手。SD 2.x 系列…...
C语言操作符(上)
操作符 一,操作符的分类1,算数操作符2,赋值操作符3,逻辑操作符4,条件操作符4,单目操作符5,函数调用和下表访问操作符 二,原码反码补码三,移位操作符1,左移操作…...
Linux TCP 之 RTT 采集与 RTO 计算
我们来看看 Linux TCP 采集 RTT 的函数 tcp_rtt_estimator,看注释,充满了胶着。 但在那个谨慎的年代,这些意味着什么? RTT 最初仅用于 RTO 的计算而不是用于调速,RTO 的计算存在两个问题,如果过估&#x…...
智慧水务管网在线监测平台(Axure高保真原型)
智慧水务管网在线监测平台是一种集成了物联网、大数据、云计算和人工智能等技术的综合管理系统。平台的主要目的是提高水务管理的效率和安全,确保供水系统的稳定运行。 智慧水务管网在线监测平台的主要特点和功能: 综合监测与管理:智慧水务平…...
Kubernetes 架构图和组件
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
不建模,无代码,如何构建一个3D虚拟展厅?
在数字化浪潮的推动下,众多企业正积极探索线上3D虚拟展厅这一新型展示平台,旨在以更加生动、直观的方式呈现其产品、环境与综合实力。然而,构建一个既专业又吸引人的3D虚拟展厅并非易事,它不仅需要深厚的技术支持,还需…...
MMDetection学习系列(5)——Mask R-CNN深度探索与实战指南
目录 实例分割 R-CNN系列 R-CNN Fast R-CNN Faster R-CNN Mask R-CNN Mask R-CNN 头部结构细节 两阶段架构 损失函数 掩码 RoIAlign Faster R-CNN中的RoIPool Mask R-CNN 中的RoIAlign 实例分割实验 消融研究 定性结果 SOTA 方法比较 Coovally AI模型训练与…...
Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析
目录 前言1. TRANSLATE2. REGEXP_LIKE3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. TRANSLATE TRANSLATE 用于替换字符串中指定字符集的每个字符,返回替换后的字符串 逐一映射输入字…...
PHP语言的软件工程
PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支,它涉及软件的规划、开发、测试和维护。在现代开发中,PHP作为一种流行的服务器端脚本语言,广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…...
量变引起质变
量变引起质变,这个是最本质的规律,重复进行一件事情,这件事情就会越来越完善,越来越完美,哪怕是菜鸟,重复多了就是大佬。 我从说话结结巴巴,到说话流畅,只是用了15天直播写代码&…...
【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中,制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动,旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...
Linux内核 -- Linux 的 BIO框架
深入理解 Linux 的 BIO 在 Linux 内核中,BIO(Block I/O)是块层(block layer)用于描述块设备 I/O 请求的核心数据结构。它在文件系统与块设备驱动程序之间充当“载体”,负责把数据页及相关元数据从上层提交…...
Spring WebFlux 和 Spring MVC 的主要区别是什么?
Spring WebFlux 和 Spring MVC 都是 Spring 框架中用于构建 Web 应用的模块,但它们在设计理念、编程模型、性能特性等方面存在显著区别。以下是它们的主要区别: ### 1. **编程模型** - **Spring MVC**: - **同步和阻塞**:Spri…...
卸载和安装Git小乌龟、git基本命令
卸载 Git 打开控制面板: 按 Win R 打开运行对话框,输入 control 并按回车键。或直接在功能搜索里搜索“控制面板”。在控制面板中,选择“程序”或“程序和功能”。 查找并卸载 Git: 在程序列表中找到“Git”或“Git for Windows…...
正向代理与反向代理的主要区别
正向代理与反向代理的主要区别 正向代理与反向代理都是中间服务器 特性正向代理反向代理位置客户端和目标服务器之间客户端和后端服务器之间客户端感知客户端知道代理的存在,并主动连接代理客户端不知道代理的存在,认为直接连接目标服务器主要用途隐藏…...
vue组件学习三(插槽)
目录 1、匿名插槽2、渲染作用域3、默认内容4、具名插槽5、条件插槽6、作用域插槽7、具名作用域插槽最后 1、匿名插槽 父组件调用Mycomponet1组件 <Mycomponet1>click me </Mycomponet1>子组件为 <button><slot></slot> </button>最后结…...
Django 的 `Meta` 类和外键的使用
Django 的 Meta 类和外键的使用 1. Meta 类的常用选项2. 外键(ForeignKey)字段的使用2.1 基本用法2.2 ForeignKey 参数2.3 外键删除选项(on_delete) 3. 外键和查询3.1 获取作者的所有书籍3.2 通过书籍查找作者3.3 使用 select_rel…...
DP动态规划字典版递归
https://blog.csdn.net/m0_74408723/article/details/145303575?spm1001.2014.3001.5501 一只青蛙,可以一次跳上1级台阶,也可以一次跳上2级台阶。求这只青蛙跳10级台阶有多少种跳法? 优化上一篇青蛙跳台阶问题。可以采用Map字典存放f(n-1)f(…...
图论 八字码
我们可能惊异于某些技巧。我们认为这个技巧真是巧妙啊。或者有人认为我依靠自己的直觉想出了这个表示方法。非常自豪。我认为假设是很小的时候,比如说小学初中,还是不错的。到高中大学,就有一些不成熟了。因为这实际上是一个竞技。很多东西前…...
Vscode:问题解决办法 及 Tips 总结
Visual Studio Code(简称VSCode)是一个功能强大的开源代码编辑器,广泛用于各种编程语言和开发场景,本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法,使用过程中的技巧 文章目录 扩展安装失败调试配…...