[C++随想录] map和set的使用
map和set的使用
- set
- 初始化
- find
- erase
- count
- lower_bound && upper_bound
- equal_ range
- map
- insert
- [ ]运算符
- multiset && multimap
set — — key模拟
map — — key_value模型
set
初始化

void set_test1()
{set<int>s;s.insert(10);s.insert(12);s.insert(13);s.insert(9);s.insert(10);s.insert(5);cout << "s-> ";for (auto e : s){cout << e << " ";}cout << endl;set<int>s1(s.begin(), s.end());cout << "s1-> ";set<int>::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";++it;}cout << endl;
}int main()
{set_test1();return 0;
}
运行结果:
s-> 5 9 10 12 13
s1-> 5 9 10 12 13
- set默认
去重 + 排序 - 支持
遍历, 但不支持随机访问, 即[], 迭代器是双向迭代器👇👇👇

find

void set_test2()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);auto it = s.find(10);if(it != s.end())cout << *it << endl;auto tem = s.find(5);if(tem != s.end())cout << *tem << endl;
}int main()
{set_test2();return 0;
}
运行结果:
5
- 算法库里面的 find — —
暴力搜索, O(N)
set自带的 find — — 利用二叉搜索树的特性O(logN)
void set_test2()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);// set自带的find函数auto it = s.find(5);if(it != s.end())cout << *it << endl;// 算法库里面的 find函数auto tem = find(s.begin(), s.end(), 5);if(tem != s.end())cout << *tem << endl;
}int main()
{set_test2();return 0;
}
运行结果:
5
5
erase

- 先找后删
🗨️思考: 下面的代码正确不?
void set_test1()
{set<int>s;s.insert(10);s.insert(12);s.insert(13);s.insert(9);s.insert(10);s.insert(5);auto it = s.begin();s.erase(it);s.erase(it + 3);
}int main()
{set_test1();return 0;
}
- 上面的代码是错误的:
set没有重载 +- 即使重载了 +, 我们也要
判断我们要删除的地址是否在s中
我们应该这样写👇👇👇
void set_test1()
{set<int>s;s.insert(10);s.insert(12);s.insert(13);s.insert(9);s.insert(10);s.insert(5);cout << "s-> ";for (auto e : s){cout << e << " ";}cout << endl;auto it = s.find(10);// 判断 s 中是否有此元素if (it != s.end()){s.erase(it);}cout << "删除后-> ";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test1();return 0;
}
运行结果:
s-> 5 9 10 12 13
删除后-> 5 9 12 13
- 传值直接删
void set_test1()
{set<int>s;s.insert(10);s.insert(12);s.insert(13);s.insert(9);s.insert(10);s.insert(5);cout << "s-> ";for (auto e : s){cout << e << " ";}cout << endl;// 传值直接删除s.erase(10);cout << "删除后-> ";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test1();return 0;
}
运行结果:
s-> 5 9 10 12 13
删除后-> 5 9 12 13
🗨️传值直接删除, 不用判断元素在不在set对象中?
- 不用!
如果在对象中, 就删除; 如果不在对象中, 啥事不干👇👇👇
void set_test1()
{set<int>s;s.insert(10);s.insert(12);s.insert(13);s.insert(9);s.insert(10);s.insert(5);cout << "s-> ";for (auto e : s){cout << e << " ";}cout << endl;// 传值直接删除s.erase(15);cout << "删除后-> ";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test1();return 0;
}
运行结果:
s-> 5 9 10 12 13
删除后-> 5 9 10 12 13
- 删除一段区间
void set_test1()
{set<int>s;s.insert(10);s.insert(12);s.insert(13);s.insert(9);s.insert(10);s.insert(5);cout << "s-> ";for (auto e : s){cout << e << " ";}cout << endl;// 删除 [5, 10)区间内的值auto i = s.find(5);auto j = s.find(10);s.erase(i, j);cout << "删除后-> ";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test1();return 0;
}
运行结果:
s-> 5 9 10 12 13
删除后-> 10 12 13
- 这个我感觉很
鸡肋:- set不支持
+ - 找到了还要判断是否存在
- set不支持
从而导致, 用这个方法删除一段区间有点麻烦.
不过, 后面有两个函数: lower_bound 和 upper_bound, 可以配合使用找寻 一段区间, 可以配合这个方法使用~~
count
在 set中, 判断一个元素存不存在:
- find
- count

count函数返回 该元素的个数, 由于set 去重 ⇒ 所以, 返回 1 或 0
count函数 在 multiset 里面可以体现出 统计元素个数的功能
- 判段元素在不在
void set_test3()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);// count 和 find 来判断元素是否存在int tem = s.count(5);if (tem > 0){cout << "5元素存在" << endl;}else{cout << "5元素不存在" << endl;}auto it = s.find(11);if (it != s.end()){cout << "11元素存在" << endl;}else{cout << "11元素不存在" << endl;}
}int main()
{set_test3();return 0;
}
运行结果:
5元素存在
11元素不存在
- 统计元素个数
void set_test3()
{multiset<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);s.insert(15);s.insert(15);int n = s.count(15);cout << "15的个数: " << n << endl;}int main()
{set_test3();return 0;
}
运行结果:
15的个数: 3
- multiset 和 set
- set中的
key是唯一的, 而multiset中的key 允许是多个的 - set 和 multiset 都是包含在
<set>的头文件中的
- set中的
lower_bound && upper_bound

void set_test3()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);s.insert(10);s.insert(11);// lower_bound && upper_boundauto itlow = s.lower_bound(5);cout << *itlow << endl;auto itup = s.upper_bound(15);cout << *itup << endl;}int main()
{set_test3();return 0;
}
运行结果:
5
18
itlow 和 itup构成的区间是 [itlow, itup) ⇒ 这样我们就可以 删除特定区间的内容👇👇👇
void set_test3()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);s.insert(10);s.insert(11);cout << "s ->";for (auto e : s){cout << e << " ";}cout << endl;// 删除 5~15 这段区间的内容auto itlow = s.lower_bound(5);auto itup = s.upper_bound(15);s.erase(itlow, itup);cout << "删除 5~15 ->";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test3();return 0;
}
运行结果:
s ->1 5 10 11 12 15 18
删除 5~15 ->1 18
equal_ range

-
pair:
在C++中,std::pair是一个模板类,用于保存两个元素的有序对。std::pair的成员变量first和second分别表示有序对中的第一个和第二个元素。你可以使用点号(.)操作符来访问这些成员
如果对象里面 存在val, 那么正常返回; 如果对象里面 不存在val, 那么就 返回一个不存在的区间
void set_test3()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(1);s.insert(10);s.insert(11);cout << "s ->";for (auto e : s){cout << e << " ";}cout << endl;cout << "equal_range(5) val存在的情况" << endl;auto eit1 = s.equal_range(5);cout << "first element-> " << *eit1.first << endl;cout << "second element-> " << *eit1.second << endl;cout << "equal_range(6) val不存在的情况" << endl;auto eit2 = s.equal_range(6);cout << "first element-> " << *eit2.first << endl;cout << "second element-> " << *eit2.second << endl;}int main()
{set_test3();return 0;
}
运行结果:
equal_range(5) val存在的情况
first element-> 5
second element-> 10
equal_range(6) val不存在的情况
first element-> 10
second element-> 10
假设: set中, 值等于value的下标为i;
其实, set 使用 equal_range 最多只能返回 [i, i+1)
multiset 使用 equal_range 可以返回 [i, i+1, i+2, ... ... j)
set
void set_test3()
{set<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(5);s.insert(5);s.insert(5);s.insert(1);s.insert(10);s.insert(11);cout << "s ->";for (auto e : s){cout << e << " ";}cout << endl;// set 删除所有等于5的值auto eit = s.equal_range(5);s.erase(eit.first, eit.second);cout << "set删除所有等于5的值 ->";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test3();return 0;
}
运行结果:
s ->1 5 10 11 12 15 18
set删除所有等于5的值 ->1 10 11 12 15 18
multiset
void set_test3()
{multiset<int> s;s.insert(15);s.insert(18);s.insert(12);s.insert(5);s.insert(5);s.insert(5);s.insert(5);s.insert(1);s.insert(10);s.insert(11);cout << "s ->";for (auto e : s){cout << e << " ";}cout << endl;// set 删除所有等于5的值auto eit = s.equal_range(5);s.erase(eit.first, eit.second);cout << "multiset删除所有等于5的值 ->";for (auto e : s){cout << e << " ";}cout << endl;
}int main()
{set_test3();return 0;
}
运行结果:
s ->1 5 5 5 5 10 11 12 15 18
multiset删除所有等于5的值 ->1 10 11 12 15 18
map
insert

void map_test1()
{map<string, string> m1;// C++98// 1. 传一个pair对象pair<string, string> kv1("insert", "插入");m1.insert(kv1);// 2. 传一个pair的匿名对象m1.insert(pair < string, string>("sort", "排序"));// 3. make_pairm1.insert(make_pair("love", "爱情"));// C++11// 4. 多参数的构造函数支持隐式类型转换, 用{}m1.insert({ "insert", "xxx" });for (auto e : m1){cout << e.first << "-> " << e.second << endl;}cout << endl;// 区间初始化map<string, string> m2(m1.begin(), m1.end());map<string, string>::iterator it = m2.begin();while (it != m2.end()){// cout << (*it).first << "-> "(*it).second << endl;cout << it->first << "-> " << it->second << endl;++it;}cout << endl;}int main()
{map_test1();return 0;
}
运行结果:
insert-> 插入
love-> 爱情
sort-> 排序insert-> 插入
love-> 爱情
sort-> 排序
-
map的
insert, 传的是一个pair结构, 返回的也是一个pair结构.

-
map的
insert, 是根据key来进行判断的: 如果 key形同, value不同, 就不会覆盖 -
map的
insert, 几种传参方式:- C++98
1. 传一个pair对象
2. 传一个pair的匿名对象
3. 用make_pair来创建一个pair对象 - C++11
4.支持多参数的隐式类型转换, 用 {}
- C++98
-
map的迭代器也是
双向迭代器, 而不是随机迭代器. map虽然重载了[ ], 但跟我们平常的不大一样, 下面会讲的

[ ]运算符

一般的[ ] 是返回 存储对象的, 比如: vector 就返回 int, list 就返回 string;
但是 map中的 [ ], 不是返回 pair结构, 而是返回 pair结构中的 第二个元素的.
我们细看一下 [ ] 的不同:

[ ]的本质是 调用 insert, 通过 key 来返回 value:
- 当key不存在时, 会插入该键的新元素, 并返回value的引用
- 当key存在时, 会返回value的引用
⇒ [ ]有两大功能 插入 + 修改
[ ] 的本质是调用 insert, 但是有所不同
- insert中, key相同, value不同的键值对是
不会覆盖的- [ ]中, 会返回value的引用, 所以能对value就行修改 ⇒ key相同, value不同的键值对是可以
覆盖的
void map_test1()
{map<string, string> m1;// C++98// 1. 传一个pair对象pair<string, string> kv1("insert", "插入");m1.insert(kv1);// 2. 传一个pair的匿名对象m1.insert(pair < string, string>("sort", "排序"));// 3. make_pairm1.insert(make_pair("love", "爱情"));// C++11// 4. 多参数的构造函数支持隐式类型转换, 用{}m1.insert({ "insert", "xxx" });for (auto e : m1){cout << e.first << "-> " << e.second << endl;}cout << endl;// 插入m1["muyu"];cout << "[]: 插入(muyu)" << endl;for (auto e : m1){cout << e.first << "-> " << e.second << endl;}cout << endl;// 修改(覆盖)m1["insert"] = "xxx";cout << "[]: 修改(insert)" << endl;for (auto e : m1){cout << e.first << "-> " << e.second << endl;}cout << endl;// 插入 + 修改m1["mutong"] = "沐潼";cout << "[]: 插入 + 修改(<mutong, 沐潼>)" << endl;for (auto e : m1){cout << e.first << "-> " << e.second << endl;}cout << endl;
}int main()
{map_test1();return 0;
}
运行结果:
insert-> 插入
love-> 爱情
sort-> 排序[]: 插入(muyu)
insert-> 插入
love-> 爱情
muyu->
sort-> 排序[]: 修改(insert)
insert-> xxx
love-> 爱情
muyu->
sort-> 排序[]: 插入 + 修改(<mutong, 沐潼>)
insert-> xxx
love-> 爱情
mutong-> 沐潼
muyu->
sort-> 排序
在这里, 我们可以 简化之前写的统计次数👇👇👇
int main()
{map<string, int> count;string arr[] = {"苹果", "桃子", "土豆", "苹果", "栗子", "桃子"};for (auto e : arr){// 直接改变 e 所对应的value值count[e]++;}for (auto e : count){cout << e.first << "-> " << e.second << endl;}cout << endl;return 0;
}
运行结果:
栗子-> 3
苹果-> 1
苹果-> 2
土豆-> 4
map的其他迭代器诸如 find, erase, count, lower_bound, upper_bound, equal_range ; 用法都和 set的用法都差不多的, 在这里, 我们就不过多介绍了!
multiset && multimap
multiset 和 multimap都允许 key冗余
void multi_test()
{multiset<int> ms;ms.insert(1);ms.insert(1);ms.insert(5);ms.insert(2);cout << "multiset " << endl;for (auto e : ms){cout << e << " ";}cout << endl << endl;multimap<string, int> mm;mm.insert({ "苹果", 1 });mm.insert({ "苹果", 2 });mm.insert({ "栗子", 3 });mm.insert({ "土豆", 4 });cout << "multimap " << endl;for (auto e : mm){cout << e.first << "-> " << e.second << endl;}cout << endl;}int main()
{multi_test();return 0;
}
运行结果:
multiset
1 1 2 5multimap
栗子-> 3
苹果-> 1
苹果-> 2
土豆-> 4
multiset 和 multimap 的其它接口的用法 都是和 set 和 map 都是大致一样的
望门投止思张俭,忍死须臾待杜根;
我自横刀向天笑,去留肝胆两昆仑。
— — 谭嗣同《狱中题壁》
相关文章:
[C++随想录] map和set的使用
map和set的使用 set初始化finderasecountlower_bound && upper_boundequal_ range mapinsert[ ]运算符 multiset && multimap set — — key模拟 map — — key_value模型 set 初始化 void set_test1() {set<int>s;s.insert(10);s.insert(12);s.insert(…...
公网IP怎么设置?公网ip有哪些优点和缺点?
随着互联网的普及,越来越多的人开始关注网络安全和隐私保护。其中,公网IP的设置成为了一个备受关注的话题。本文将详细介绍公网IP的设置方法以及公网IP的优点和缺点。 一、公网IP设置方法 1. 路由器设置 在家庭或企业网络中,路由器通常是最重…...
蓝桥杯第 2 场算法双周赛 第2题 铺地板【算法赛】c++ 数学思维
题目 铺地板https://www.lanqiao.cn/problems/5887/learning/?contest_id145 问题描述 小蓝家要装修了,小蓝爸爸买来了很多块(你可以理解为数量无限)2323 规格的地砖,小蓝家的地板是 nm 规格的,小蓝想问你…...
APScheduler-调度器 BackgroundScheduler
当你有主程序需要执行,让定时任务在后台执行时,可以用BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler import time # 仅运行定时任务 scheduler BackgroundScheduler() # interval example, 间隔执行,…...
浅谈UI自动化测试
随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。 接口自动化测试可以模拟和执行应用程序…...
golang 工程组件 grpc-gateway—yaml定义http规则,和自定义实现网关路由
yaml定义http规则,和自定义实现网关路由 proto定义http规则总归是麻烦的,因为proto文件还是定义消息,grpc接口好一些。配置http规则有更好的方式。我们可以使用yaml文件定义接口的http规则。 同时有些接口不是只是让网关转发这么简单 有时需…...
在NLP中一下常见的任务,可以用作baseline;MRPC,CoLA,STS-B,RTE
1.MRPC(Microsoft Research Paraphrase Corpus)任务 是一个用于文本匹配和相似度判断的任务。在MRPC任务中,给定一对句子,模型需要判断它们是否是语义上等价的。MRPC任务的训练集和测试集由约5700对英语句子组成。每个句子对都有…...
【计算机网络笔记】Cookie技术
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
在虚拟环境中,通过pip安装tensorflow
目录 激活python虚拟环境,更新pip 通过pip 安装tensorflow 确定python版本: 编辑安装tensorflow: 编辑 为什么使用pip安装tensorflow? 激活python虚拟环境,更新pip 命令为python -m pip install --upgrade pip 通过pip 安装tensorf…...
【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题
【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题 1 问题描述: 我用restframework(ModelSerializerGenericApiView)开发了一组符合RestFul接口标准的接口,这意味着它将支持客户端发来的GET、POST、…...
神经网络与深度学习第四章前馈神经网络习题解答
[习题4-1] 对于一个神经元 ,并使用梯度下降优化参数时,如果输入恒大于0,其收敛速度会比零均值化的输入更慢。 首先看一下CSDN的解释: 如果输入x恒大于0,使用sigmoid作为激活函数的神经元的输出值将会处于饱和状态&a…...
Go 语言操作 MongoDb
文章目录 连接数据库插入数据库插入一条数据批量插入数据 查询数据用 BSON 进行复合查询聚合查询 更新数据删除数据 连接数据库 package mainimport ("context""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"…...
UE4/5 竖排文字文本
方法一、使用多行文本组件 新建一个Widget Blueprint 添加Text 或者 Editable Text(Multi-Line) 、TextBox(Multi-Line) 组件。 添加文字,调整字号,调整成竖排文字。 在Wrapping (换行)面板中 : 勾选 Auto Wrap te…...
centos jdk 安装
1、oracle官网下载jdk8 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2、楼主用的以前下载好的安装包jdk-8u111-linux-x64.gz。下载后使用工具如Xftp将安装包上传到/opt目录下,这里随便什么目录都行,并解压安装包。 c…...
【计算机网络】什么是HTTPS?HTTPS为什么是安全的?
【面试经典题】 前言: HTTP最初的设计就是用于数据的共享和传输,并没有考虑到数据的安全性,如窃听风险,篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密,数据完整性检验和身份认证…...
Windows-Oracle19c 安装详解-含Navicate远程连接配置 - 同时连接Oracle11g和Oracle19c
文章目录 0 说明1 下载链接2 安装:一定要以管理员身份运行,不然后面有可能会报错。3 启动监听4. 登录Oracle4 Navicate远程连接-配置监听4.1 修改监听文件4.2 网络配置助手-配置本地监听端口4.3 Navicate连接成功 5 Navicate同时连接两个Oracle数据库 0 …...
文件权限详解
一、文件类型 ll指令查看文件详细信息中,第一列就是文件类型。 常见的文件类型有: 1、 - :普通文件 (文本、源代码、图片、视频、可执行) 2、 d :目录文件 3、b :块设备 4、c ࿱…...
在声明和定义的一些小坑
1、静态成员变量的初始化 静态成员变量声明在 .h 头文件文件中,初始化应该在 .cpp 源文件中 就会出现"找到一个或多个多重定义的符号",下面的错误 class MyString{public:typedef char* iterator;typedef const char* const_iterator;iterator begin();…...
浏览器事件循环 (event loop)
进程与线程 进程 进程的概念 进程是操作系统中的一个程序或者一个程序的一次执行过程,是一个动态的概念,是程序在执行过程中分配和管理资源的基本单位,是操作系统结构的基础。 简单的来说,就是一个程序运行开辟的一块内存空间&a…...
P1868 饥饿的奶牛
根据题意可以知道是一个动态规划,看完数据范围之后可以知道是一个线性DP。 解决方法有点类似于背包问题,枚举背包的每一个空间。 如果把坐标轴上每个点都看成一个块儿,只需要按顺序求出前 i 个块儿的最大牧草堆数,f[i] 就是前i的…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
