【C++初阶】string类的常见基本使用
👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
目录
- 一、什么是STL
- 二、string类概念总结
- 三、string类的常用接口(重点)
- 3.1 常见的四种构造(初始化)
- 3.2 常见容量操作
- 3.2.1 size
- 3.2.2 empty
- 3.2.3 clear
- 四、string类对象的修改操作
- 4.1 push_back
- 4.2 append
- 4.3 运算符重载+=
- 4.4 insert
- 4.5 erase
- 4.6 swap
- 4.7 c_str
- 4.8 find
- 4.9 pop_back
- 4.10 substr
- 4.11 rfind
- 4.12 operator+
- 五、迭代器iterator
- 5.1 什么是迭代器
- 5.2 常见的string类迭代器
- 5.2.1 begin
- 5.2.2 end
- 5.2.3 rbegin + rend --- 反向迭代器
- 5.2.4 const修饰的对象
- 六、string类遍历操作
- 6.1 string的底层重载operator[]
- 6.2 迭代器遍历
- 6.3 语法糖(范围for)
- 6.4 补充:迭代器的意义
- 七、string的读入与输出
- 7.1 getline - 输入
- 7.2 puts - 输出
- 八、string转化为其他类型
- 九、其他类型转string
一、什么是STL
STL
(standard template libaray
- 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL的六大组件:
二、string类概念总结
-
string
是一个管理字符数组的类 -
该类的接口与常规容器的接口基本相同,再添加了一些专门的函数用来操作
string
的常规操作。例如:push_back
等(后面会详细介绍) -
string
在底层实际是:basic_string
;模板类的别名:typedef basic_string<char, char_traits, allocator> string
-
在使用
string
类时,必须包含头文件#include <string>
三、string类的常用接口(重点)
3.1 常见的四种构造(初始化)
- 构造空的
string
类对象,即空字符串
#include <iostream>
#include <string>
using namespace std;int main()
{// 构造空的string类对象s1string s1;cout << "s1的内容为:" << s1 << endl;return 0;
}
【输出结果】
- 用
C
语言的格式字符串来构造string
类对象
#include <iostream>
#include <string>
using namespace std;int main()
{// 用C格式字符串构造string类对象s2string s2("hello world");cout << "s2的内容为:" << s2 << endl;return 0;
}
【输出结果】
- 拷贝构造函数
#include <iostream>
#include <string>
using namespace std;int main()
{// 用C格式字符串构造string类对象s2string s2("hello world");// 拷贝构造string s3(s2);cout << "s3的内容为:" << s3 << endl;return 0;
}
【输出结果】
string
类支持赋值运算符重载=
#include <iostream>
#include <string>
using namespace std;int main()
{string s1 = "hello world";cout << s1 << endl;s1 = "hello China";cout << s1 << endl;return 0;
}
【输出结果】
3.2 常见容量操作
3.2.1 size
返回字符串的有效长度(不包含
'\0'
)
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");int s1_lengrh = s1.size();cout << "s1的有效长度为:" << s1_lengrh << endl;return 0;
}
【输出结果】
注意:
'\0’
是标识字符串结束的特殊字符,不算有效字符!
3.2.2 empty
检测字符是否为空字符串。如果是空字符串返回
true
,否则返回false
#include <iostream>
#include <string>
using namespace std;int main()
{string s1;string s2("hello world");cout << s1.empty() << endl;cout << s2.empty() << endl;return 0;
}
【输出结果】
3.2.3 clear
清空有效字符
clear
#include <iostream>
#include <string>
using namespace std;int main()
{string s2("hello world");s2.clear();cout << "s2的内容为:" << s2 << endl;return 0;
}
【输出结果】
四、string类对象的修改操作
4.1 push_back
功能:尾插一个字符
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("h");s1.push_back('i');cout << s1 << endl;return 0;
}
【输出结果】
4.2 append
功能:尾插字符串
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello ");s1.append("world");cout << s1 << endl;return 0;
}
【输出结果】
4.3 运算符重载+=
既可以尾插一个字符,也能尾插一个字符串。
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("h");// 尾插一个字符s1 += 'i';cout << "s1 = " << s1 << endl;string s2("hello ");// 尾插一个字符串s2 += "world";cout << "s2 = " << s2 << endl;return 0;
}
【输出结果】
4.4 insert
- 功能:插入字符或者字符串
- 缺点:效率低,特别是头插
【代码示例】
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("world");// 头插s1.insert(0, "hello");cout << s1 << endl;// 限制插入的个数string s2("hello");s2.insert(0, "world", 3);cout << s2 << endl;// 配合迭代器string s3("11111");// 尾插3个xs3.insert(s3.begin() + 5, 3, 'x');cout << s3 << endl;return 0;
}
【输出结果】
4.5 erase
功能:删除某个位置的字符或者字符串
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");// 从下标为2往后删除3个字符s1.erase(2, 3);cout << s1 << endl;string s2("hello world");// 不指定删除的个数,该下标往后全删除s2.erase(2);cout << s2 << endl;//头删string s3("hello world");s3.erase(s3.begin());//尾删s3.erase(s3.end() - 1);cout << s3 << endl;return 0;
}
【输出结果】
4.6 swap
功能:交换
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello");string s2("world");s1.swap(s2);cout << "s1 = " << s1 << endl;cout << "s2 = " << s2 << endl;return 0;
}
【输出结果】
4.7 c_str
功能:将
string
转化为C字符串。
比如printf
只能打印内置类型,如果想打印string
类型,需要使用c_str
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");printf("%s\n", s1.c_str());return 0;
}
【输出结果】
4.8 find
功能:查找字符。找到第一次出现的字符下标,如果没有找到会返回
npos
,本质就是-1
。
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");int pos = s1.find("o");cout << "第一次出现的位置:" << pos << endl;// 还可以指定查找的起始位置pos = s1.find("o", 6);cout << "第二次出现的位置:" << pos << endl;return 0;
}
【输出结果】
4.9 pop_back
功能:尾删一个字符
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");s1.pop_back();cout << s1 << endl;return 0;
}
【输出结果】
4.10 substr
功能:截取子串
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");// 从下标为0开始往后截取长度为5的子串cout << s1.substr(0, 5) << endl;// 如果没有第二个参数,默认截到尾cout << s1.substr(0) << endl;return 0;
}
【输出结果】
4.11 rfind
功能:从字符串的后面开始往前找第一次出现的字符
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");int pos = s1.rfind('o');cout << pos << endl;return 0;
}
【输出结果】
4.12 operator+
string
类重载了运算符+
,可以拼接2个字符串
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello ");string s2("world");string s3 = s1 + s2;cout << s3 << endl;return 0;
}
【输出结果】
五、迭代器iterator
5.1 什么是迭代器
现阶段可以理解迭代器是像指针一样的类型,但也有可能是指针,也有可能不是指针。
string
迭代器的语法形式:
// string::iterator是类型
// it是变量名
string::iterator it = xxx;
5.2 常见的string类迭代器
5.2.1 begin
【文档描述】
【代码演示】
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");// 返回的是指向字符串的第一个字符string::iterator it = s1.begin();// 迭代器是像指针一样的类型// 因此解引用就可以访问第一个字符cout << *it << endl;return 0;
}
【程序结果】
5.2.2 end
【文档描述】
【代码示例】
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");string::iterator it = s1.end() - 1;cout << *it << endl;return 0;
}
【输出结果】
5.2.3 rbegin + rend — 反向迭代器
【文档描述】
【代码示例】
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit;rit++;}cout << endl;return 0;
}
【输出结果】
注:如果觉得
string::reverse_iterator
太长,可以使用auto
代替。
5.2.4 const修饰的对象
注:
const
修饰的对象不能用普通迭代器
看看以下代码
#include <iostream>
#include <string>
using namespace std;void print(const string& s)
{string::iterator sit = s.begin();while (sit != s.end()){cout << *sit;sit++;}cout << endl;
}int main()
{string s1("hello world");//封装print函数来打印print(s1);return 0;
}
【错误报告】
const
修饰的对象只能用const
的迭代器
【正确代码】
#include <iostream>
#include <string>
using namespace std;void print(const string& s)
{string::const_iterator sit = s.begin();while (sit != s.end()){cout << *sit;sit++;}cout << endl;
}int main()
{string s1("hello world");//封装print函数来打印print(s1);return 0;
}
【输出结果】
六、string类遍历操作
因为
string
底层是支持流提取>>
,用cout
就可以直接打印string
字符串的内容,但是打印的结果比较固定。因此以下三种方式既可以访问遍历,也可以对其内容修改打印。
6.1 string的底层重载operator[]
相当于数组下标的访问
#include <iostream>
#include <string>
using namespace std;int main()
{string s2("hello world");for (int i = 0; i < s2.size(); i++){// 遍历string字符串cout << s2[i];}cout << endl;return 0;
}
【输出结果】
当然还可以对字符串进行修改
以下是将字符串的内容都+1
#include <iostream>
#include <string>
using namespace std;int main()
{string s2("hello world");// 修改for (int i = 0; i < s2.size(); i++){s2[i]++;}// 输出for (int i = 0; i < s2.size(); i++){cout << s2[i];}cout << endl;return 0;
}
【输出结果】
注意:这里需要区分
string
和普通数组
s2[i]
的底层是调用s2.operator[](i)
函数
- 普通数组的底层是解引用操作
char ch1[] = "abcdef";ch1[0];// 访问下标为0的元素
ch1[0]
的底层含义是:*(ch1 + 0)
6.2 迭代器遍历
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){cout << *it;it++;}cout << endl;return 0;
}
【程序结果】
当然也可以对字符串的内容进行修改
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){(*it)++;it++;}it = s1.begin();while (it != s1.end()){cout << *it;it++;}cout << endl;return 0;
}
【输出结果】
在这里就有的人想,迭代器的代码要写这么多,还不如用下标来访问。所以,迭代器的意义是什么呢? 让我们接着往下看
6.3 语法糖(范围for)
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");for (auto x : s1){cout << x;}cout << endl;return 0;
}
【输出结果】
范围for
同样支持修改
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");// 修改for (auto& x : s1){x++;}// 输出结果for (auto x : s1){cout << x;}cout << endl;return 0;
}
【输出结果】
范围
for
虽然很香,但是有个致命的缺点:**不能倒着遍历,只有反向迭代器可以倒着遍历。 **
6.4 补充:迭代器的意义
范围for又和迭代器有啥关系呢?迭代器的意义又是什么呢?
- 其实,范围
for
代码短,之所以是这么好用是因为:范围for的底层就是用迭代器实现的!!!
我们可以利用反汇编来看看代码底层:
范围for
的底层就是调用了begin
和end
。
- 迭代器提供了一种统一的方式访问和修改容器的数据
以下以vector
容器为例
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;// 尾插数据v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);// 迭代器vector<int>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << ' ';vit++;}cout << endl;// 范围forfor (auto e : v){cout << e << ' ';}cout << endl;return 0;
}
【输出结果】
如果一个容器支持迭代器,那么它必定支持访问
for
,反之就不一定了。
这里再提一嘴,很多人认为下标访问是主流,但是使用下标访问的空间必须是连续的,所以当我拿出链表,阁下又该如何应对呢?因此迭代器是可以访问链表的。
- 迭代器可以和算法配合使用
这里给大家介绍一个浅浅介绍一个算法(后序会补充),-- sort
【文档描述】
【代码演示】
#include <vector>
#include <iostream>
#include <algorithm> // 算法库头文件
using namespace std;int main()
{vector<int> v;// 尾插数据v.push_back(10);v.push_back(3);v.push_back(2);v.push_back(5);// 迭代器cout << "sort前:";for (auto x : v){cout << x << ' ';}cout << endl;sort(v.begin(), v.end());// 迭代器打印sort后的结果cout << "sort后:";vector<int>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << ' ';vit++;}cout << endl;return 0;
}
【程序结果】
七、string的读入与输出
7.1 getline - 输入
注意:cin
和scanf
读取到空格或者回车就不再往后读取了
#include <iostream>
#include <string>
using namespace std;int main()
{string s1;// 输入cin >> s1;// 输出cout << s1 << endl;return 0;
}
【输出结果】
而getline
可以读入空格
#include <iostream>
#include <string>
using namespace std;int main()
{string s1;// 输入getline(cin, s1);// 输出cout << s1 << endl;return 0;
}
【输出结果】
7.2 puts - 输出
因为
string
类重载了流插入<<
和流提取>>
,因此可以支持cin
和cout
的输入输出。除此之外还能用puts
来输出string
类的字符串(自带换行的)。注意:puts
和printf
只能打印内置类型的字符串,因此可以用c_str
转化为C语言的字符串
#include <iostream>
#include <string>
using namespace std;int main()
{string s1("hello world");puts(s1.c_str());return 0;
}
【输出结果】
八、string转化为其他类型
#include <iostream>
#include <string>
using namespace std;int main()
{// 转整型int convert1 = stoi("1111111");double convert2 = stod("3.14");float convert3 = stof("6.66");cout << convert1 << endl;cout << convert2 << endl;cout << convert3 << endl;return 0;
}
【输出结果】
九、其他类型转string
#include <iostream>
#include <string>
using namespace std;int main()
{// 整型转stringstring s1 = to_string(1111);// double转string string s2 = to_string(3.14);return 0;
}
【输出结果】
相关文章:

【C++初阶】string类的常见基本使用
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...

【ArcGIS Pro二次开发】(60):按图层导出布局
在使用布局导图时,会遇到如下问题: 为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。 在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3…...
docker-desktop数据目录迁移
1.退出docker-desktop后执行 wsl --list -v 如下 NAME STATE VERSION * docker-desktop Stopped 2docker-desktop-data Stopped 22.执行以下命令进行数据导出:(需要等待命令执行完成)…...

03.利用Redis实现缓存功能---解决缓存穿透版
学习目标: 提示:学习如何利用Redis实现添加缓存功能解决缓存穿透版 学习产出: 缓存穿透讲解图: 解决方案: 采用缓存空对象采用布隆过滤器 解决方案流程图: 1. 准备pom环境 <dependency><gro…...

全景图!最近20年,自然语言处理领域的发展
夕小瑶科技说 原创 作者 | 小戏、Python 最近这几年,大家一起共同经历了 NLP(写一下全称,Natural Language Processing) 这一领域井喷式的发展,从 Word2Vec 到大量使用 RNN、LSTM,从 seq2seq 再到 Attenti…...
Mybatis参数传递
Map传参, #{}里的key要一一对应不能乱写,如果不存在则会填充NULL,不会报错 Map<String, Object> map new HashMap<>(); // 让key的可读性增强 map.put("carNum", "103"); map.put("brand", "奔驰E300L&…...

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【2】
😀前言 手动实现 Spring 底层机制的第2篇 实现了任务阶段一编写自己 Spring 容器-准备篇【2】 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的…...

部署模型并与 TVM 集成
本篇文章译自英文文档 Deploy Models and Integrate TVM tvm 0.14.dev0 documentation 更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站 本节介绍如何将 TVM 部署到各种平台&…...
Android Navigation 导航切换fragment用法
对于Android Navigation组件的导航到Fragment,您可以按照以下步骤操作: 首先,在您的项目的build.gradle文件中添加Navigation依赖: dependencies {def nav_version "2.3.4"implementation "androidx.navigation…...

Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退
艹!MLGBZD! 真TMD折腾人! 出现原因: 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder,此时是没有问题的,然后打开Anaconda Prompt,查看有哪些包,pip list 这时候开始首次安…...

【jvm】jvm整体结构(hotspot)
目录 一、说明二、java代码的执行流程三、jvm的架构模型3.1 基于栈式架构的特点3.2 基于寄存器架构的特点 一、说明 1.hotspot vm是目前市场上高性能虚拟机的代表作之一 2.hotspot采用解释器与即时编译器并存的架构 3.java虚拟机是用来解释运行字节码文件的,入口是字…...

通达信波段选股公式,使用钱德动量摆动指标(CMO)
钱德动量摆动指标(CMO)是由图莎尔钱德发明的,取值范围在-100到100之间,是捕捉价格动量的技术指标。该指标计算近期涨幅之和与近期跌幅之和的差值,然后将计算结果除以同期所有价格波动的总和。本文的波段选股公式使用均线识别趋势,…...

家电维修小程序开发指南:从零搭建到上线
随着科技的发展和人们生活水平的提高,家电已经成为人们生活中不可或缺的一部分。然而,随之而来的是家电维修门店业务的繁忙和效率的考验。为了提高家电维修门店的效率和服务质量,建立一个便捷高效的小程序已成为必要的选择。 本文将介绍一个简…...

玩赚音视频开发高阶技术——FFmpeg
随着移动互联网的普及,人们对音视频内容的需求也不断增加。无论是社交媒体平台、电商平台还是在线教育,都离不开音视频的应用。这就为音视频开发人员提供了广阔的就业机会。根据这些年来网站上的音视频开发招聘需求来看,音视频开发人员的需求…...

python 变量赋值 修改之后 原值改变
python 是一种动态语言,因此变量的类型和值 在运行时均可改变。当我们将一个变量赋值给另一个变量时,实际上是将变量的引用地址传递给新的变量,这意 味着新旧变量将指向同一个位置。因此,在更改其中一个变量的值时,另一…...

拂袖一挥,zipfile秒列zip包内容
使用wxpython列出文件夹中的zip文件及内容 最近在做一个文件管理的小工具,需要列出选择的文件夹下的所有zip压缩文件,并在点击某个zip文件时能够显示其中的内容。为此我使用了wxpython来实现这个功能。 1. 导入需要的模块 首先导入程序需要的模块: import wx import os imp…...
InnoDB文件物理结构解析2 - FIL_PAGE_INDEX
1. 关于索引组织表 InnoDB使用的是索引组织表(IOT)的方式存储表记录,索引组织表以主键构建一个B-tree的数据结构来存储行记录,行记录存储在树的叶节点内。这与Oracle数据库是不同的,Oracle数据库默认创建的表是堆组织表(HOT),HOT…...
XML-BEANS compiled schema: Could not locate compiled schema resource 异常处理
使用poi5.2.2生成ppt,生成堆叠图,设置值时抛出异常 XML-BEANS compiled schema: Could not locate compiled schema resource org/apache/poi/schemas/ooxml/system/ooxml/stoverlappercent872etype.xsb (org.apache.poi.schemas.ooxml.system.ooxml.st…...

IOC容器 - Autofac
DI(依赖注入):DI(Dependency Injection)是一种实现松耦合和可测试性的软件设计模式。它的核心思想是将依赖关系的创建与管理交给外部容器,使得对象之间只依赖于接口而不直接依赖于具体实现类。通过依赖注入…...

用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码
一、i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度,如果是vue2点几,记得安装i18n的8版本,不然会自动安装的最新版本,后面会报错哦,查询了下资料,好像最新版本是适配的vue3。 npm install vue-…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...