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

【C++从0到王者】第十二站:vector基本使用

文章目录

  • 一、vector基本介绍
  • 二、vector的基本使用
  • 三、vector\<char> 和string的区别
  • 四、vector接口介绍
    • 1.vector的模板参数
    • 2.构造函数
    • 3.迭代器
    • 4.size和max_size
    • 5.resize和reserve
    • 6.operator[]和at
    • 7.front和back
    • 8.data
    • 9.push_back和pop_back
    • 10.insert和erase
    • 11.assign
    • 12.swap和clear
  • 五、几道经典例题
    • 1.只出现一次的数字
    • 2.杨辉三角
    • 3.电话号码的字母组合

一、vector基本介绍

如下图所示,从这里我们可以得知,vector其实本质是一个动态增长的顺序表,是一个可以改变容量大小的数组。也就是说它与string的本质是一样的,而vector这个英文翻译成中文是向量的意思
在这里插入图片描述就像数组一样,vector的元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与数组一样高效。但与数组不同的是,它们的大小可以动态变化,容器会自动处理它们的存储。
在内部,vector使用动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增加大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一个相对昂贵的任务,因此,vector不会在每次向容器中添加元素时重新分配。
相反,vector容器可以分配一些额外的存储空间,以适应可能的增长,因此容器的实际容量可能大于包含其元素严格所需的存储空间(即其大小)。库可以实现不同的增长策略,以平衡内存使用和重新分配,但在任何情况下,重新分配应该只发生在对数增长的大小间隔内,以便在向量末尾插入单个元素时可以提供平摊的常数时间复杂度(参见push_back)。
因此,与数组相比,向量消耗更多的内存,以换取以有效的方式管理存储和动态增长的能力。
与其他动态序列容器(deque、lists和forward_lists)相比,vector可以非常高效地访问其元素(就像数组一样),并且可以相对高效地从其末端添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,它们的性能比其他操作差,并且迭代器和引用的一致性不如列表和forward_lists。

二、vector的基本使用

我们首先来大致浏览以下vector的接口,其实我们也能够大概理解这些接口的意思
在这里插入图片描述

我们可以大概的使用一些这些接口,如下所示

void testvector1()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;vector<int>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << " ";vit++;}cout << endl;
}

在这里插入图片描述

处理加入内置类型之外,我们也可以加入string,vector等类类型

void testvector2()
{vector<string> v;string name("zhangsan");v.push_back(name);v.push_back(string("lisi"));v.push_back("wangwu");vector<vector<int>> vv;
}

在上述代码中,我们相对vector<string>插入一个string的方式可以有很多种,比如先构造一个string,然后尾插他,比如直接插入匿名对象,比如直接插入字符串,让这个字符串进行隐式类型转换构造欻string以后然后在插入进去

我们甚至还可以定义vector<vetor<int>>这种套娃的形式,其实这个形式本质就是一个二维数组

三、vector<char> 和string的区别

显而易见是肯定不可以相互替代

  1. 首先string和vector<char>在结构上就有所区别,string它会主动加上\0,而vector是不会的,这样一来,vector其实是不是那么跟c语言进行兼容的
  2. 其次string的接口是更加丰富的。string还有+=,比较大小的接口这些都是有实际意义的。而对于vector对于比较大小是没有意义的,虽然库里面也支持了比较大小。
  3. string还有插入一个字符,插入字符串等更加丰富的接口,而vector要针对于各种类型,所以它就没有这么多接口

总而言之,即以下两点

  1. string要求最后又\0,可以更好的兼容C语言
  2. string有很多他的专用接口函数

所以说,vector和string有各自存在的价值的

四、vector接口介绍

1.vector的模板参数

如下图所示,vector的模板参数有以下两个,一个是T,决定vector里面的数据是什么类型的,一个是缺省的模板参数,这个是一个内存池,库里面自动提供了,当然我们一般用这个也就够了,不会自己去写的

在这里插入图片描述

2.构造函数

如下所示,有如下几种构造函数
在这里插入图片描述allocator是一个内存池,他也是一个缺省参数,我们暂时不管他

不难看出,第一个是一个无参的构造函数,第二个是n个val的构造,第三个是一个迭代器区间进行初始化,第四个是拷贝构造函数

下面是前两个的使用

void testvector3()
{vector<int> v1;vector<int> v2(10, 1);vector<string> v3(10, "****");for (auto e : v2){cout << e << " ";}cout << endl;for (auto e : v3){cout << e << " ";}cout << endl;
}

在这里插入图片描述

对于第三个构造函数,我们注意到他其实是一个模板,也就是说,他可以使用任意一个迭代器进行初始化。只要类型匹配即可。

void testvector3()
{vector<int> v1;vector<int> v2(10, 1);vector<string> v3(10, "****");for (auto e : v2){cout << e << " ";}cout << endl;for (auto e : v3){cout << e << " ";}cout << endl;vector<int> v4(v2.begin(), v2.end());for (auto e : v4){cout << e << " ";}cout << endl;vector<string> v5(v3.begin(), v3.end());for (auto e : v5){cout << e << " ";}cout << endl;string s("hello world");vector<char> v6(s.begin(), s.end());for (auto e : v6){cout << e << " ";}cout << endl;//数组名其实就是一个天然的迭代器int a[] = { 1,2,3,4 };vector<int> v7(a, a + 4);for (auto e : v7){cout << e << " ";}cout << endl;
}

在这里插入图片描述

除此之外,我们知道。stl有容器和算法,而算法中比如说sort他就是支持各种类型的容器进行排序,因为其是用模板的,对某一个迭代器区间进行排序
在这里插入图片描述

我们可以去使用一下,如下所示,库里面默认是排升序,即<,我们如果要排升序的话,可以直接使用greater<int>对象。这个类型库里面已经定义好了,我们直接用就可以,也可以直接用他的匿名对象

void testvector4()
{vector<int> v;v.push_back(151);v.push_back(1);v.push_back(1511);v.push_back(12);v.push_back(11);v.push_back(10);for (auto e : v){cout << e << " ";}cout << endl;sort(v.begin(), v.end());for (auto e : v){cout << e << " ";}cout << endl;//greater<int> gt;//sort(v.begin(), v.end(), gt);sort(v.begin(), v.end(), greater<int>());for (auto e : v){cout << e << " ";}cout << endl;}

在这里插入图片描述

还有如下的使用等

void testvector5()
{string s("hello world");sort(s.begin(), s.end());cout << s << endl;int a[] = { 456,12,11,151 };sort(a, a + 4);for (auto e : a){cout << e << " ";}cout << endl;
}

在这里插入图片描述

3.迭代器

他有如下的几种迭代器

下面是正向迭代器,前者支持读写,后者只读
在这里插入图片描述

下面是反向迭代器,前置支持读写,后者只读
在这里插入图片描述

正向迭代器的使用很简单,我们现在来看一下反向迭代器的使用

void testvector6()
{vector<int> v;v.push_back(151);v.push_back(1);v.push_back(1511);v.push_back(12);v.push_back(11);v.push_back(10);for (auto e : v){cout << e << " ";}cout << endl;sort(v.rbegin(), v.rend());for (auto e : v){cout << e << " ";}cout << endl;//greater<int> gt;//sort(v.rbegin(), v.rend(), gt);sort(v.rbegin(), v.rend(), greater<int>());for (auto e : v){cout << e << " ";}cout << endl;
}

在这里插入图片描述

不难得出,反向迭代器可以直接排降序。

4.size和max_size

如下是size这个接口,他的作用是返回当前元素的个数。这个还是比较常用的一个接口

在这里插入图片描述

如下是max_size,这个接口在实际中并无太大的用处,他的功能是返回vector所能容纳的最大元素数。
在这里插入图片描述

5.resize和reserve

这两个接口与string是类似的,resize是开空间+填数据,而reserve仅仅只是开空间,不改变size的值。

下面是我们容易犯的一个错误

void testvector7()
{vector<int> v;v.reserve(10);for (int i = 0; i < 10; i++){v[i] = i;}
}

在这里插入图片描述

这里出现错误的原因其实就是因为我们混淆了reserve和resize,reserve他改变的仅仅只是capacity,不会去改变size,这样一来的话,我们就会产生越界现象。自然就会报错了。

我们应该使用resize
在这里插入图片描述

当然如果我们非要使用reserve的话,其实我们可以直接使用push_back接口,想必大家都是可以理解的

6.operator[]和at

这两个接口他与string中的接口也是类似的道理,他们两个也是存在区别的,operator[]接口他比较暴力,是使用断言的。而at中的接口他是比较温柔一点的,他是使用抛异常的方式,异常是可以捕获的

断言的缺陷就是只在debug环境下生效,在release下不生效

7.front和back

同样的与string类似,一个是访问第0个数据,一个是访问最后一个数据。这两个接口完全可以由operator[]运算符重载进行替代,存在一些冗余,但是其实还好。

8.data

data这个接口与string中的c_str接口是十分类似的,data返回的是内部的数组指针。c_str其实也是返回内部的字符串数组指针。

在这里插入图片描述

9.push_back和pop_back

这两个接口就比较简单了,分别为尾插和尾删。比较容易理解
在这里插入图片描述
在这里插入图片描述

需要注意的是,在vector中并没有提供头插头删这两个接口,因为这两个接口的效率是比较低的。一般是很少使用的

10.insert和erase

虽然并没有提供头插头删这两个接口,但是c++提供了insert和erase这个接口,同样的类比的方法,我们可以知道,insert可以在任意一个位置进行插入,erase用于在任意位置删除一个数据
在这里插入图片描述

在这里插入图片描述

我们可以简单的去使用一下

void testvector8()
{vector<int> v;v.resize(10);for (int i = 0; i < 10; i++){v[i] = i;}for (auto e : v){cout << e << " ";}cout << endl;//头删v.erase(v.begin());for (auto e : v){cout << e << " ";}cout << endl;//头插v.insert(v.begin(), 100);for (auto e : v){cout << e << " ";}cout << endl;//删除第三个位置v.erase(v.begin() + 2);for (auto e : v){cout << e << " ";}cout << endl;
}

在这里插入图片描述

假如我们现在想要删除值为5的数据,但是我们发现vector里面并没有find。事实上find在算法库里面是有的。而string中有find的一个原因就是因为string中对find的要求比较多样化,有可能是查找一个子串,有可能是查找某个字符。功能需求比较特殊,而vector是不需要写的。
在这里插入图片描述他需要接收一个迭代器区间,然后在这个区间中找到目标值。

	//删除数值为5的数据,但是不知道5在哪里vector<int>::iterator pos = find(v.begin(), v.end(), 5);if(pos != v.end()){v.erase(pos);}for (auto e : v){cout << e << " ";}cout << endl;

那么如果一个vector中涉及到很多个5,我们都想删掉,我们该如何操作呢?我们很容易就想当然的以为这样就可以了
在这里插入图片描述结果我们发现程序崩溃了,这里其实涉及到迭代器失效的问题了。我们后序在详细说明

11.assign

如下图所示,assign这个函数的作用主要就是赋值。他会将原来的vector里面的数据给清掉,然后对其进行赋值
在这里插入图片描述

void testvector9()
{vector<int> v(10, 0);for (auto e : v){cout << e << " ";}cout << endl;v.assign(10, 1);for (auto e : v){cout << e << " ";}cout << endl;
}

在这里插入图片描述

12.swap和clear

如下所示,swap即交换两个vector里面的东西
在这里插入图片描述

clear的作用是清掉vector里面的数据
在这里插入图片描述

五、几道经典例题

1.只出现一次的数字

力扣136:只出现一次的数字

题解:

这道题目是很简单的一道题,直接异或即可,使用C++的做法如下所示

class Solution {
public:int singleNumber(vector<int>& nums) {int val=0;for(int i=0;i<nums.size();i++){val^=nums[i];}return val;}
};

2.杨辉三角

力扣118:杨辉三角

题解:
这道题题目也是很简单,逻辑上没有任何难度,但是结构上难度较大
如果使用C语言的话,那么他的参数是很复杂的。因为杨辉三角其实就是一个二维数组,二维数组我们就得自己模拟一个二维数组来实现。要开二维数组,得先开一个指针数组,每个指针都要指向一个空间。而我们如果要返回的话,我们就得返回一个指针这个指针数组的指针,这个指针的类型就是int**。

除此之外还有两个输入型参数,一个是数组的行数,一个是数组的列数,由于数组的列数也是变化的,所以其实还是要传一个数组,这个数组我们直接传入的是一个指针,我们在这个指针所指向的空间中开一块数组空间在这里面进行填值。

所以这道题使用C语言结构上是非常之繁琐的
在这里插入图片描述

而如果使用C++的话,那么我们就无需自己开空间了,我们直接使用vector<vector<int>>就可以很方便的开好二维数组。极大的简化了结构上的难度。
在这里插入图片描述

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> v;v.resize(numRows);for(int i=0;i<numRows;i++){v[i].resize(i+1,0);v[i][0]=v[i][i]=1;}for(int i=2;i<v.size();i++){for(int j=1;j<v[i].size();j++){if(v[i][j]==0){v[i][j]=v[i-1][j]+v[i-1][j-1];}}}return v;}
};

3.电话号码的字母组合

力扣17:电话号码的字母组合

题解:

这道题其实确实有些复杂。它是一道典型的多路递归。比二叉树的还要复杂。
我们这样确定思路,题目中已经给出了电话号码组合,而每一个数字又对应着一个字符串的组合。我们先想办法把这些字符串给取出来。取出来以后,我们开始拿这三个字符去与下面的字符进行组合。此处相当于三路递归。为了方便,我们直接写成循环形式。
就这样写成递归的形式,然后就可以顺利的取出所有的字符组合了。
当我们的层数刚好等于电话号码的个数的时候,也就意味着,该结束本层递归了。

class Solution {string SArr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:void Combination(vector<string>& v,string digits,int level,string s){if(level==digits.size()){v.push_back(s);return ;}int num=digits[level]-'0';string str=SArr[num];for(int i=0;i<str.size();i++){Combination(v,digits,level+1,s+str[i]);}}vector<string> letterCombinations(string digits) {vector<string> v;if(digits.empty()){return v;}Combination(v,digits,0,"");return v;}
};

好了本期内容就到这里了
如果对你有帮助的话,不要忘记点赞加收藏哦!!!

相关文章:

【C++从0到王者】第十二站:vector基本使用

文章目录 一、vector基本介绍二、vector的基本使用三、vector\<char> 和string的区别四、vector接口介绍1.vector的模板参数2.构造函数3.迭代器4.size和max_size5.resize和reserve6.operator[]和at7.front和back8.data9.push_back和pop_back10.insert和erase11.assign12.…...

了解Unity编辑器之组件篇Miscellaneous(九)

一、Aim Constraint&#xff1a;是一种动画约束&#xff0c;用于使一个对象朝向另一个对象或一个指定的矢量方向 Activate按钮&#xff1a;用于激活或停用Aim Constraint。当Aim Constraint处于激活状态时&#xff0c;其约束效果将应用于目标对象。 Zero按钮&#xff1a;用于将…...

自动驾驶小车

开发自动驾驶小车涉及多个方面&#xff0c;包括硬件和软件。下面是一般情况下开发自动驾驶小车的主要步骤&#xff1a; 确定需求和功能&#xff1a;明确您的自动驾驶小车的目标和应用场景&#xff0c;确定需要的功能和特性&#xff0c;例如感知、决策、控制等。 硬件选择和安…...

机器学习深度学习——多层感知机的从零开始实现

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——多层感知机 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 为…...

Redis的基本使用命令

Redis的使用命令 Redis是一个开源的使用ANSI C编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&#xff09;可以是 字符串(String), 哈希(Hash…...

Ts入门到放弃

TS 的核心能力在于给 JS 提供静态类型检查&#xff0c;是有类型定义的 JS 的超集&#xff0c;包括 ES5、ES5 和其他一些诸如泛型、类型定义、命名空间等特征的集合。 本次仅会针对类型声明部分配合示例进行着重介绍&#xff0c;更详细的内容以及特性可以查看 Typescript handb…...

黑客技术(网络安全)学习笔记

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识&#xff0c;可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题&#xff0c;可以帮助您更好地解决网络安全的原理和技术…...

Cloud Kernel SIG 月度动态:支持龙芯和申威架构,合入两个内存新特性

Cloud Kernel SIG&#xff08;Special Interest Group&#xff09;&#xff1a;支撑龙蜥内核版本的研发、发布和服务&#xff0c;提供生产可用的高性价比内核产品。 01 SIG 整体进展 Cloud Kernel 开始支持龙芯和申威架构。 合入两个内存新特性&#xff1a;MEMCG LRU LOCK 和…...

IDEA中连接虚拟机 管理Docker

IDEA中连接虚拟机 管理Docker &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮…...

Debezium日常分享系列之:定制Debezium 信号发送和通知

Debezium日常分享系列之&#xff1a;定制Debezium 信号发送和通知 一、自定义信号和通知通道二、结论 Debezium 2.3 在信号和通知功能方面引入了新的改进。除了 Debezium 提供的预定义信号和通知通道之外&#xff0c;您还可以设置新的信号和通知通道。此功能使用户能够自定义系…...

RpcProvider(rpc服务提供者)实现思路

RpcProvider&#xff08;服务提供者&#xff09;实现思路 上一节说到&#xff0c;如何将一个本地服务发布成远程服务&#xff0c;但没有说明一个rpc框架怎么进行调用的&#xff0c;看看上节代码 #include <iostream> #include <string> #include "user.pb.h…...

GNSS技术知识你知道多少?这些你或许还未掌握

GNSS信号频段 GNSS频谱图展示了不同的GNSS信号及其星座、载波频率、调制方案&#xff0c;以及所有这些信号在同一L波段频段内如何相互关联&#xff0c;是GNSS专业人员的必备工具&#xff0c;包括设计和开发GNSS系统的工程师&#xff0c;以及测试GNSS系统的工程师。 GNSS术语 …...

YOLOv8教程系列:三、使用YOLOv8模型进行自定义数据集半自动标注

YOLOv8半自动标注 目标检测半自动标注的优点包括&#xff1a; 1.提高标注效率&#xff1a;算法能够自动标注部分数据&#xff0c;减少了人工标注的工作量&#xff0c;节省时间和资源。 2.降低成本&#xff1a;自动标注可以减少人工标注的成本&#xff0c;特别是对于大规模数据…...

AI聊天GPT三步上篮!

1、是什么&#xff1f; CHATGPT是OpenAI开发的基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构的聊天型人工智能模型。也就是你问它答&#xff0c;根据网络抓去训练 2、怎么用&#xff1f; 清晰表达自己诉求&#xff0c;因为它就是一个AI助手&#…...

如何彻底卸载VMware

目录 第一章、停止并卸载VMware程序1.1&#xff09;停止VMware有关的服务1.2&#xff09;打开任务管理器停止进程1.3&#xff09;卸载VMware程序 第二章、残留文件删除2.1&#xff09;打开注册表2.2&#xff09;删除注册表残留文件2.3&#xff09;C盘文件删除 友情提醒&#xf…...

[个人笔记] Windows配置NTP时间同步

Windows - 运维篇 第六章 Windows配置NTP时间同步 Windows - 运维篇系列文章回顾Windows配置NTP时间同步域控环境的NTP配置工作组环境的NTP配置Windows的CMD部分命令集 参考来源 系列文章回顾 第一章 迁移WinSrv系统到虚拟机 第二章 本地安全策略xcopy实现实时备份文件夹内容 …...

Jetson Docker 编译 FFmpeg 支持硬解nvmpi和cuvid

0 设备和docker信息 设备为NVIDIA Jetson Xavier NX&#xff0c;jetpack版本为 5.1.1 [L4T 35.3.1] 使用的docker镜像为nvcr.io/nvidia/l4t-ml:r35.2.1-py3,详见https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml 使用下列命令拉取镜像: sudo docker pull nvcr…...

某某某小说app接口抓包分析

详细说明查看原文 https://sdk.qzbonline.com/ver9/shuhuajs/sdk/ioszh_shuhuajs_conf.htmlhttps://sdk.qzbonline.com/prov8/ymqxs/sdk/ios_ymqxs_conf.htmlhttps://sdk.qzbonline.com/prov8/ymqxs/sdk/ios_ymqxs_conf2.htmlhttps://sdk.qzbonline.com/prov8/fqhyxs/sdk/iosz…...

开发一个RISC-V上的操作系统(四)—— 内存管理

目录 往期文章传送门 一、内存管理简介 二、Linker Script 链接脚本 三、动态分配内存 四、测试 往期文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二…...

区块链:可验证随机函数

本篇主要介绍可验证随机函数的定义及其在区块链上的作用。 1 可验证随机函数 1.1 定义 可验证随机函数(Verifiable Random Function&#xff0c;VRF)本质上还是一类具有验证功能的伪随机函数。对于一个特定的输入 m m m以及输入者的私钥 S K SK SK&#xff0c;VRF会输出一个随…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

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…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...