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

C++ STL vector容器详解:从原理到实践

引言

亲爱的小伙伴们,今天我要和大家分享一个C++编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性,又能自动调整大小,让你告别固定大小数组的困扰。不管你是刚接触C++的新手,还是想深入理解vector实现原理的老手,这篇博客都能带给你新的收获!

一、什么是vector?

想象一下,你正在收集各种小玩具,但不确定最终会有多少个。用普通数组的话,你得提前决定一个上限,太小了不够用,太大了又浪费空间。这时候,vector就像一个神奇的收纳盒,它能根据你放入的玩具数量自动调整大小!

定义与特点

  • 动态数组:vector是一个能够存放任意类型的动态数组
  • 连续内存:vector中的元素在内存中连续存储,支持高效的随机访问
  • 自动扩容:当空间不足时,vector会自动分配更大的内存空间
  • 类型安全:通过模板机制确保类型安全

vector的内部结构

从实现原理上看,vector内部维护三个关键指针:

指向数据的起始位置 —— start

指向最后一个元素的下一个位置 —— finish

指向分配的内存空间的尾端 —— end_of_storage

!vector内部结构示意图

这就像一个能伸缩的宿舍:

  • start是宿舍的门口
  • finish是最后一名同学睡的床位后面一点的位置
  • end_of_storage是宿舍的墙壁(容量上限)

二、vector的基本操作

创建vector

#include <vector>// 创建空vectorstd::vector<int> vec1;// 创建包含5个元素的vector,所有元素初始化为0std::vector<int> vec2(5);// 创建包含5个元素的vector,所有元素初始化为10std::vector<int> vec3(5, 10);// 使用初始化列表(C++11)std::vector<int> vec4 = {1, 2, 3, 4, 5};// 从数组创建vectorint arr[] = {1, 2, 3, 4, 5};std::vector<int> vec5(arr, arr + 5);// 从另一个vector创建std::vector<int> vec6(vec5);

这就像不同的方式开party:可以先空着等人来(vec1),可以先邀请5个人(vec2),可以先邀请5个特定的朋友(vec3)...

添加和删除元素


std::vector<int> vec;// 在尾部添加元素vec.push_back(10);  // 添加元素10到尾部// 在指定位置插入元素vec.insert(vec.begin() + 1, 20);  // 在第二个位置插入20// 删除尾部元素vec.pop_back();// 删除指定位置的元素vec.erase(vec.begin() + 1);  // 删除第二个元素// 清空所有元素vec.clear();

想象一下排队买票:

  • push_back是有人来排队,自动站到队尾
  • insert是有人插队到指定位置
  • pop_back是最后一个人不想排了,离开了
  • erase是队伍中间某个人离开了
  • clear是突然下大雨,所有人都散了

访问元素

std::vector<int> vec = {10, 20, 30, 40, 50};// 使用索引访问int a = vec[2];  // 获取索引为2的元素(30)// 使用at函数(带边界检查)int b = vec.at(3);  // 获取索引为3的元素(40),越界会抛出异常// 获取第一个和最后一个元素int first = vec.front();  // 获取第一个元素(10)int last = vec.back();    // 获取最后一个元素(50)

这就像找教室里的同学:直接叫号(索引)、点名确认(at)、找第一个和最后一个。

三、vector的容量管理

理解vector的容量管理是掌握其高效使用的关键。

size与capacity

  • size:当前vector中实际元素的个数
  • capacity:当前vector在不扩容的情况下最多能容纳的元素个数

std::vector<int> vec;for(int i = 0; i < 10; i++) {vec.push_back(i);std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;}

可能的输出结果:

Size: 1, Capacity: 1Size: 2, Capacity: 2Size: 3, Capacity: 4Size: 4, Capacity: 4Size: 5, Capacity: 8Size: 6, Capacity: 8Size: 7, Capacity: 8Size: 8, Capacity: 8Size: 9, Capacity: 16Size: 10, Capacity: 16

这就像一个聚会场地:

  • size是实际到场的人数
  • capacity是场地能容纳的最大人数
  • 当人数超过容量时,需要换一个更大的场地

扩容原理

当vector需要更多空间时:

  1. 分配一块更大的内存(通常是当前容量的1.5倍或2倍)
  1. 将现有元素复制到新内存
  1. 释放旧内存
  1. 更新内部指针

这个过程叫做重新分配(reallocation),它是耗时的操作,因为需要复制所有元素。

优化容量管理

// 预留空间,避免频繁扩容vec.reserve(1000);  // 预分配至少能容纳1000个元素的空间// 调整大小(会改变size)vec.resize(100);    // 调整为100个元素,如果扩大则用默认值填充// 减少容量以适应当前大小vec.shrink_to_fit();  // C++11引入
  • reserve是提前租一个足够大的场地,避免中途换场地
  • resize是主动调整聚会人数
  • shrink_to_fit是在人到齐后,换一个刚好够用的小场地,节省费用

四、vector的迭代器

迭代器是访问容器元素的统一接口,就像"智能指针"。

std::vector<int> vec = {10, 20, 30, 40, 50};// 使用迭代器遍历for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";  // 输出:10 20 30 40 50}// C++11引入的范围for循环(语法糖)for(auto& element : vec) {std::cout << element << " ";  // 输出同上}// 反向迭代器for(std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {std::cout << *rit << " ";  // 输出:50 40 30 20 10}

这就像参观博物馆:

  • 普通迭代器是从入口到出口的参观路线
  • 反向迭代器是从出口回到入口的路线
  • 范围for循环就是跟着导游走,不用担心路线

五、vector的常见陷阱与优化

1. 迭代器失效问题

当vector扩容或删除元素时,迭代器可能会失效:

std::vector<int> vec = {1, 2, 3, 4, 5};auto it = vec.begin() + 2;  // 指向元素3vec.insert(vec.begin(), 0);  // 可能导致扩容// 此时it已失效,使用it将导致未定义行为

解决方法:在可能导致迭代器失效的操作后,重新获取迭代器。

2. 不必要的复制

// 低效的循环添加元素std::vector<int> vec;for(int i = 0; i < 10000; i++) {vec.push_back(i);  // 可能多次扩容}// 优化:预先分配足够空间std::vector<int> vec2;vec2.reserve(10000);  // 提前分配空间for(int i = 0; i < 10000; i++) {vec2.push_back(i);  // 避免扩容}

3. 返回值优化

// 避免不必要的复制void processVector(const std::vector<int>& vec) {// 使用const引用作为参数}std::vector<int> createVector() {std::vector<int> result = {1, 2, 3};return result;  // 编译器会优化,避免不必要的复制}

六、实际应用案例

案例1:动态二维数组

// 创建10x20的二维数组std::vector<std::vector<int>> matrix(10, std::vector<int>(20, 0));// 访问元素matrix[5][10] = 100;// 动态调整行数matrix.resize(15);  // 现在是15x20

案例2:高效字符串分割

std::vector<std::string> split(const std::string& str, char delimiter) {std::vector<std::string> tokens;std::string token;std::istringstream tokenStream(str);while (std::getline(tokenStream, token, delimiter)) {tokens.push_back(token);}return tokens;}

案例3:自定义对象的存储

struct Student {std::string name;int age;Student(const std::string& n, int a) : name(n), age(a) {}};std::vector<Student> students;students.push_back(Student("小明", 18));students.push_back(Student("小红", 17));// C++11的emplace_back可以在容器内直接构造对象,避免复制students.emplace_back("小刚", 19);

总结

vector是C++中最常用的容器之一,它提供了数组的高效随机访问,又克服了数组大小固定的限制。通过深入理解vector的工作原理,你可以更高效地使用它,避免常见陷阱,写出更优雅高效的代码。

记住:合理使用reserve预分配空间、避免不必要的复制、注意迭代器失效问题,这些都是使用vector的关键技巧!

在下一篇博客中,我们将更深入地探讨vector的内存管理机制和更多高级用法。敬请期待!

相关文章:

C++ STL vector容器详解:从原理到实践

引言 亲爱的小伙伴们&#xff0c;今天我要和大家分享一个C编程中的"神器"——vector容器&#xff01;作为STL&#xff08;标准模板库&#xff09;中最常用的容器之一&#xff0c;vector就像是一个"超级数组"&#xff0c;既有数组的高效随机访问特性&#…...

[计算机网络]数据链路层

0 概论&#xff1a;数据链路层都干什么事&#xff0c;提供啥功能 比物理层再高一层就是数据链路层&#xff0c;咱们上一篇讲物理层&#xff0c;物理层直接接触传输介质&#xff0c;现在数据链路层是使用物理层的传输服务&#xff0c;然后实现更多的功能。物理层是只管把比特流…...

基于 vue-flow 实现可视化流程图

vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库&#xff0c;它允许开发者轻松创建交互式的流程图、工作流图、节点图等。 主要特点 易于使用 &#xff1a;提供了简洁的 API 和组件&#xff0c;开发者可以快速上手并创建复杂的流程图。高度可定制 &#xff1a;支持…...

【网络编程】HTTP(超文本传输协议)详解

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:网络编程 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;HTTP定义 &#x1f4cc;HTTP工作原理 1.客户端发起请求: 2.服务器处理请求: 3.客户端处理响应: &#x1f4cc;HTTP关键特性 &#x1f38f;HTTP请求方法 &am…...

NuttX 与 PX4 系统开发全流程详解

NuttX 与 PX4 系统开发全流程详解 目录 1. NuttX 构建与使用2. NuttX 启动流程解析3. BootLoader 源码分析4. GPIO 驱动机制5. I2C 驱动分析6. PX4 系统架构简析7. uORB 消息机制8. PX4 应用开发示例9. 串口及 GPS 驱动解析10. MAVLink 协议与 PX4 交互 1. NuttX 构建与使用 …...

【Mytais系列】Myatis的设计模式

目录 设计模式 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 建造者模式&#xff08;Builder Pattern&#xff09; 3. 动态代理模式&#xff08;Dynamic Proxy Pattern&#xff09; 4. 模板方法模式&#xff08;Template Method Pattern&#xff09; 5. 策略模…...

Linux:进程优先级及环境

一&#xff1a;孤儿进程 在Linux系统中&#xff0c;当一个进程创建了子进程后&#xff0c;如果父进程执行完毕或者提前退出而子进程还在运行&#xff0c;那么子进程就会成为孤儿进程。子进程就会被systemd&#xff08;系统&#xff09;进程收养&#xff0c;其pid为1 myproces…...

网络编程初识

注&#xff1a;此博文为本人学习过程中的笔记 1.socket api 这是操作系统提供的一组api&#xff0c;由传输层向应用层提供。 2.传输层的两个核心协议 传输层的两个核心协议分别是TCP协议和UDP协议&#xff0c;它们的差别非常大&#xff0c;编写代码的风格也不同&#xff0c…...

疾病传播模拟 ——python实操

1、需求 疾病传播模拟 定义一个Infection类,包含初始感染人数、每日感染率等属性,以及一个simulate_spread方法用于模拟疾病传播过程。 使用numpy随机生成初始感染人数(范围1-100)和每日感染率(范围0.01-0.1)。 创建Infection对象,模拟10天的疾病传播过程,每天计算感染…...

用docker ffmpeg测试视频vmaf分数,很快不用编译

之前测试vmaf要自己编译libvmaf&#xff0c;自己编译ffmpeg&#xff0c;巨麻烦&#xff0c;或者用老旧不再维护的docker仓库&#xff0c;最近在docker hub上发现了编译了libvmaf的ffmpeg的docker&#xff0c;而且镜像很小&#xff0c;适合直接运行。 # dest.mp4 评分视频&…...

【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤

Nginx安装和配置 下载nginx-1.19.3-http-flv 模块预编译包并解压放在d盘&#xff0c;路径就跟安装步骤里说的一样(如下图)&#xff0c;不然会有其他问题出现。 打开conf/nginx.conf&#xff0c;查看RTMP和http相关的配置&#xff0c;确认端口号和路由名称 ffpemg推流视频…...

SQL笔记——左连接、右连接、内连接

前言&#xff1a;总是忘记表连接的区别&#xff0c;在面试的时候也容易被问到&#xff0c;因此就好记性不如烂笔头吧 集合运算 有并集、交集、差集 联合查询*&#xff08;针对行合并的&#xff09;* union为关键字&#xff0c;就是将两个select的结果求并集&#xff08;此时重…...

iOS启动优化:从原理到实践

前言 在iOS应用开发中&#xff0c;启动速度是影响用户体验的重要因素之一。研究表明&#xff0c;启动时间每增加1秒&#xff0c;用户留存率就会下降约7%。本文将深入探讨iOS启动优化的各个方面&#xff0c;从底层原理到具体实践&#xff0c;帮助开发者打造更快的应用启动体验。…...

202553-sql

目录 一、196. 删除重复的电子邮箱 - 力扣&#xff08;LeetCode&#xff09; 二、602. 好友申请 II &#xff1a;谁有最多的好友 - 力扣&#xff08;LeetCode&#xff09; 三、176. 第二高的薪水 - 力扣&#xff08;LeetCode&#xff09; 一、196. 删除重复的电子邮箱 - 力扣…...

Socket-TCP

在TCP/ip协议中&#xff0c;用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信&#xff01; 端口号范围划分 0 - 1023: 知名端口号&#xff0c;HTTP&#xff0c;FTP&#xff0c;SSH 等这些广为使用的应用层协议&#xff0c;他们的端口号都是固定的。…...

BOSS的收入 - 华为OD机试(A卷,C++题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 代码不懂有疑问欢迎留言或私我们的VX&#xff1a;code5bug。 题目描述 一个 XX 产品行销总公司&#xff0c;只有一个 boss&#xff0c;其有若干一级分销&…...

神经网络的基本概念与深度解析——基于生物机制的仿生建模与工程实现

广义上讲&#xff0c;神经网络是泛指生物神经网络与人工神经网络这两个方面。所谓生物神经网络是指由中枢神经系统&#xff08;脑和脊髓&#xff09;及周围神经系统&#xff08;感觉神经、运动神经、交感神经、副交感神经等&#xff09;所构成的错综复杂的神经网络&#xff0c;…...

JavaScript基础-运算符优先级

在JavaScript编程中&#xff0c;理解运算符的优先级是编写正确且高效代码的关键之一。当一个表达式包含多个运算符时&#xff0c;JavaScript会根据运算符的优先级来决定执行顺序。如果不了解这些规则&#xff0c;可能会导致意外的结果。本文将详细介绍JavaScript中的运算符优先…...

【RocketMQ NameServer】- NameServer 启动源码

文章目录 1. 前言2. RocketMQ 通信架构3. NameServer 启动流程3.1 创建 NameServerController3.2 启动 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整体流程3.3.2 创建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…...

Learning vtkjs之WindowedSincPolyDataFilter

过滤器 模型简化&#xff08;光滑处理&#xff09; 介绍 像是对模型进行特征信息的简化&#xff08;光滑处理&#xff09; 效果 核心代码 主要流程 const fullScreenRenderer vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerR…...

C++ - 数据容器之 forward_list(创建与初始化、元素访问、容量判断、元素遍历、添加元素、删除元素)

一、创建与初始化 引入 <forward_list> 并使用 std 命名空间 #include <forward_list>using namespace std;创建一个空 forward_list forward_list<int> fl;创建一个包含 5 个元素&#xff0c;每个元素初始化为 0 的 forward_list forward_list<int&g…...

ES6/ES11知识点

ES 全称ECMAScript &#xff0c;是脚本语言的规范&#xff0c;javascript是ES的一种实现。 作用域链 在 JavaScript 中&#xff0c;作用域链是一个非常重要的概念&#xff0c;它决定了变量和函数的访问顺序。掌握作用域链有助于深入理解执行上下文、闭包和变量查找等概念。 …...

力扣面试150题--二叉树的最大深度

Day 40 题目描述 做法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…...

360驱动大师v2.0(含网卡版)驱动工具软件下载及安装教程

1.软件名称&#xff1a;360驱动大师 2.软件版本&#xff1a;2.0 3.软件大小&#xff1a;218 MB 4.安装环境&#xff1a;win7/win10/win11 5.下载地址&#xff1a; https://www.kdocs.cn/l/cdZMwizD2ZL1?RL1MvMTM%3D 提示&#xff1a;先转存后下载&#xff0c;防止资源丢失&…...

Excel-CLI:终端中的轻量级Excel查看器

在数据驱动的今天&#xff0c;Excel 文件处理成为了我们日常工作中不可或缺的一部分。然而&#xff0c;频繁地在图形界面与命令行界面之间切换&#xff0c;不仅效率低下&#xff0c;而且容易出错。现在&#xff0c;有了 Excel-CLI&#xff0c;一款运行在终端中的轻量级Excel查看…...

AI Agent开发第48课-DIFY中利用AI动态判断下一步流程-DIFY调用API、REDIS、LLM

开篇 之前我们在《AI Agent开发第47课-DIFY处理多步流程慢?你确认用对了?》中讲述了DIFY的设计中在整合多步LLM时如避免过多调用LLM的良好设计,并给出了AI工作流的相应设计手法。今天我们要在上一篇的基础上把“上门维修预约”这个流程进一步按照实际业务需求加入用户在整个…...

C# 操作符

C# 操作符 一、操作符概览二、优先级与运算顺序三、各类操作符的实例 一、操作符概览 操作符&#xff08;运算符&#xff09;的本质是函数的简记法 操作符不能脱离与它关联的数据类型 int x 5; int y 4; int z x / y; Console.WriteLine(z);//输出1double a 5.0; double b…...

python下载

一、下载python和IDIE 1.进入python官网 加载可能有点慢&#xff0c;因为是国外网站 下载 点击Downloads按钮&#xff0c;选择版本下载。 安装 勾选两个多选框&#xff0c;点击Install Now安装完成&#xff0c;进入开始菜单&#xff0c;多出一个Python xxx.xxx文件夹&…...

tp5 php获取农历年月日干支甲午

# 切换为国内镜像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次尝试安装 composer require overtrue/chinese-calendar核心写法一个农历转公历&#xff0c;一个公历转农历 农历闰月可能被错误标记&#xff08;例如 闰四月 应表示…...

MySQL安装完全指南:从零开始到配置优化(附避坑指南)

&#x1f525; 前言&#xff1a;为什么你总是装不好MySQL&#xff1f; &#xff08;实话实说&#xff09;每次看到新手在MySQL安装环节疯狂踩坑&#xff0c;老司机都忍不住想摔键盘&#xff01;明明官网下载的安装包&#xff0c;怎么就会报错呢&#xff1f;为什么别人的环境变…...

5.3刷题

P3370 【模板】字符串哈希 #include<bits/stdc.h> using namespace std; #define int long long typedef unsigned long long ull; int n; ull myhash(string s){ull code 0, x 131, y 140814840257324663;for(int i 0; i < s.size(); i){code (code * x (ull)…...

KeyPresser 一款自动化按键工具

1. 简介 KeyPresser 是一款自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程…...

# LeetCode 1007 行相等的最少多米诺旋转

LeetCode 1007 行相等的最少多米诺旋转 原题英文&#xff1a;Minimum Domino Rotations For Equal Row 难度&#xff1a;中等 | 标签&#xff1a;数组、贪心 1 题目重述 给定两行长度相同的多米诺骨牌&#xff1a; tops[i] 表示第 i 张骨牌上面的数字&#xff1b;bottoms[…...

【Agent搭建】利用coze平台搭建一个AI销售?

目录 一、关于coze 核心功能 二、搭建属于你自己智能体 备注&#xff1a;&#xff08;以下说明比较需要调整的板块&#xff09; 1、从Prompt工程开始 2、搭建工作流 3、添加知识 三、总结 一、关于coze Coze是字节跳动推出的AI应用开发平台&#xff0c;专注于帮助用户快速…...

Linux系统中安装GitLab

一、安装前准备&#xff1a;确认系统要求&#xff08;新手必看&#xff01;&#xff09; 系统版本&#xff1a;推荐 Ubuntu 20.04 或更高&#xff08;本文以 Ubuntu 22.04 为例&#xff09;。内存要求&#xff1a; 最低&#xff1a;2GB RAM&#xff08;仅建议测试环境&#xf…...

PowerShell安装Chocolatey

文章目录 环境背景安装参考 环境 Windows 11 专业版PowerShell 7.5.1.NET Framework 4.0Chocolatey v2.4.3 背景 Chocolatey是Windows上的包管理工具&#xff0c;有点类似于Linux的 yum 和 apt 命令。比如&#xff0c;PowerShell里默认没有 grep 命令&#xff0c;则可以通过…...

UDP / TCP 协议

目录 一、前言&#xff1a; 数据封装与分用&#xff1a; 二、网络协议分层模型&#xff1a; 三、UDP / TCP 协议 UDP 协议&#xff1a; 1、UDP 协议段格式&#xff1a; 2、UDP 的特点&#xff1a; TCP 协议&#xff1a; 1、TCP 协议段格式&#xff1a; 2、TCP 协议的十…...

Coding Practice,48天强训(28)

Topic 1&#xff1a;悠悠的重组数组 游游的重组偶数__牛客网 比较简单的一个题&#xff0c;因为前两天写了快速幂算法&#xff0c;一直想着用进位 &1之类的处理偶数&#xff0c;其实就正常用string装数字遍历%2就行了 #include <bits/stdc.h> using namespace std;…...

第一章 初识SpringMVC

一、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff08;模型&#xff09; V&#xff1a;View&#xf…...

虚幻引擎入门笔记

【虚幻5】UE5新手入门尝试 虚幻引擎的基础设置 1.验证-当文件误删的时候&#xff0c;对其进行验证&#xff0c;可以恢复。 2.虚幻引擎极其强大&#xff0c;可以实现多种复合技能&#xff0c;所在创建项目页面可以看见不只是创建游戏的项目 3.更改虚幻引擎默认的缓存地址。有些…...

Oracle 11g通过dg4odbc配置dblink连接神通数据库

1、安装unixodbc 2、安装神通数据库 3、 配置神通数据库odbc数据源&#xff0c;测试连通性 4、配置透明网关、监听文件以及对应编写的hsodbc的ora文件&#xff0c;我这里是initst.ora ##对应编写的hsodbc的ora文件 vim $ORACLE_HOME/hs/admin/initst.ora ##添加如下 HS_FDS_CO…...

2.2 矩阵

考点一&#xff1a;方阵的幂 1. 计算方法 (1) ​找规律法​ ​适用场景​&#xff1a;低阶矩阵或具有周期性规律的矩阵。​示例​&#xff1a; 计算 A ( 0 1 1 0 ) n A \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}^n A(01​10​)n&#xff1a; 当 n n n 为奇…...

Linux《进程概念(下)》

在之前我们已经了解了进程基本的概念、知道了如何去创建子进程&#xff1b;还了解了进程状态、进程切换、进程O(1)调度算法等&#xff0c;那么接下来在本篇当中我们就来学习环境变量和程序地址空间的相关知识&#xff0c;相信通过本篇的学习你会有很大的所获&#xff0c;一起加…...

MySQL 比较运算符详解

&#xff08;1&#xff09;符号类型运算符 运算符名称作用示例等于运算符判断两个值、字符串或表达式是否相等SELECT * FROM users WHERE age 25SELECT name FROM products WHERE category Electronics<>安全等于运算符安全地判断两个值、字符串或表达式是否相等&…...

No qualifying bean of type ‘XXX‘ available

没有某类型的bean可供使用 问题一解决方案错误问题配置类YuApiClientConfig依赖导入测试方法 问题二解决方法问题现场问题解决 问题一 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.transbit.yuapiclientsd…...

手搓一个 MCP Server 实现水质在线数据查询

随着人工智能技术的快速发展,如何将大语言模型(LLM)与实际业务场景结合,提供精准、可控的服务成为一个热门话题。MCP(Model Context Protocol)作为一种开放协议,为应用程序向 LLM 提供标准化的上下文接口,极大地简化了这一过程。本文将以构建一个水质在线查询 MCP 服务…...

neo4j初尝试

neo4j 下载并安装 这里以ubuntu 下载为例 打开neo4j官网,如下图所示&#xff0c;找到下载中心 选择 每个人可以根据自己的系统进行下载。然后解压tar -xf neo4j-community-2025.04.0-unix.tar.gz&#xff0c;如果不出意外的话&#xff0c;这里就可以直接输入命令启动了&#…...

数据分析业务拆解底层思维

业务拆解 分析前要有方法&#xff0c;从用户体验入手&#xff0c;将业务拆解&#xff0c;找到对象以及对象之间的关系。 电商平台卖的不是用户时间&#xff0c;不是流量&#xff0c;而是机会&#xff0c;而作为一个分析师就得分析机会在哪&#xff0c;帮助平台将机会更好的提…...

Linux运维——Vim技巧一

Vim技巧 一、优化重复操作1.1、 . 命令1.2、* 命令1.3、重复修改示例 二、删除单词&#xff08;daw&#xff09;三、对数字做算数运算四、操作符与动作五、插入模式5.1、插入模式下删除5.2、返回普通模式5.3、插入-普通模式5.4、不离开插入模式&#xff0c;粘贴寄存器中的文本5…...

第一节:OpenCV 基础入门-简介与环境搭建

一、OpenCV 是什么&#xff1f;为什么值得学习&#xff1f; OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 是一个开源的计算机视觉和机器学习库&#xff0c;由英特尔实验室于1999年发起&#xff0c;现已成为全球计算机视觉领域最广泛使用的工具之一。它…...