C++如何使用string类

文章目录

  • 为什么要学习string?
  • 库中的string
    • 关于编码
      • ASCII编码
      • Unicode编码
  • 迭代器Iterators
  • string常用构造接口
    • 接口声明与功能说明
    • 接口演示
  • string类对象的容量操作
    • 接口声明与功能说明
    • 接口演示
    • reverse与resize在不同平台下的扩容与缩容机制
  • string类对象的访问及遍历操作
    • 接口声明与功能说明
    • 接口演示
      • at与operator[] 的区别
      • back与front
  • string类对象的修改操作
    • operator+=
    • append
    • push_back与pop_back
    • insert
    • erase
    • replace
    • swap
    • c_str
    • find与rfind
    • substr
  • string类非成员函数
    • operator+
    • relational operators
    • getline ()
  • vs和g++下string结构的说明
    • vs下string的结构
    • g++下string的结构

为什么要学习string?

  提高效率!提高效率!提高效率!
  发展是滚滚向前的,我们是站在巨人肩膀上的一代,C++中有前辈为我们准备好的STL库,对于想要实现某种结构不再需要我们去手搓某一结构供我们使用,对于手搓某一已经被实现的结构再来使用这种行为是对生产力的浪费!


库中的string

  库中的string类是由basic_string类模板实例化而来,原因是因为string是专门用于表示字符序列的对象,而为了能够适应多种语言(汉语,英语,韩语…),basic_string类模也就实例化了不同编码方式的类。

在这里插入图片描述

string编码规则是使用单字节编码,通常采用 ASCII 或 UTF-8 编码
u16string编码规则是UTF-16 编码
u32string编码规则是UTF-32 编码
wstring编码规则是宽字符编码,可以是 UTF-16 或 UTF-32,具体取决于平台

关于编码

  大家思考在计算机中会存储像"哦豁,记得关注博主"这样的字符串内容吗?
  当然不会,在计算机底层存储的是二进制序列,像00001111这样的序列(实际上计算机存储的是一种可以用来表示1或0的状态)。

ASCII编码

  现在我们就来了解一下ASCII编码。
  以下是ASCII编码表:
  在ASCII编码规则中,一个英文字母用一个字节表示,一个汉字用多个字节表示(对于常见汉字一个汉字用两个字节表示)
  为什么出现这样的规则?
  对于英文来讲,无非就是26个英文字母大小写,一个字节就够用了,对于博大精深的汉语来讲,汉字数不胜数,一个字节最多才能表示256个汉字于是就用多个字节表示一个汉字,而在世界上有那么多种语言,那他们怎么表示呢?为了解决这个问题,也是就出现了多种编码方式,这也就是为什么basic_string要实例化多种类。
在这里插入图片描述

  我们可以通过内存存储与sizeof,验证ASCII编码规则。

#include<iostream>		
using namespace std;

int main()
{
	char Estr[] = "apple";
	char Cstr[] = "哦豁,记得关注博主哦";
	cout << sizeof(Estr) << endl;
	cout << sizeof(Cstr) << endl;
	return 0;
}

以下是内存窗口内容:
在这里插入图片描述
以下是运行结果:
(注意:字符串结尾有标识字符串末尾的’/0’)
在这里插入图片描述

Unicode编码

  Unicode编码有多种规范UTF-8、UTF-16、UTF-32。
  UTF-8为可变长度字符编码编码规则如如下:
在这里插入图片描述  UTF-16编码规则是两个字节表示一个字符
  UTF-32编码规则是四个个字节表示一个字符
  对于UTF-16与UTF-32来讲编码规则相较于UTF-8来讲更规范简单,但是空间浪费太大。


温馨提示,string的接口众多,请耐心阅读,对于过于鸡肋接口博主会一笔带过,本文重点讲解C++98的接口
为了方便大家理解,提前声明string的成员变量有哪些,以下为成员对象

size_t _capacity;//对象容量
size_t _size;//对象的有效字符数
char* _str;//字符串

为了方便大家了解string的相关接口,首先要了解string的迭代器

迭代器Iterators

在这里插入图片描述
对于string的迭代器来讲他可以说是STL容器中最简单的,这里提一下,他的迭代器实际为原生指针。后续我们会对string进行模拟实现,到时再详细讲解。

iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
begin() 函数返回一个指向字符串首字符的迭代器,而 end() 函数返回一个指向字符串末尾后一个字符的迭代器(末尾后的一个位置)。const 修饰符版本的函数用于在 const 对象上获取 const 迭代器。

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
rbegin() 返回一个指向字符串末尾后一个字符的迭代器(末尾位置),而 rend() 函数返回一个指向字符串首字符前一个位置的逆向迭代器。const 修饰符版本的函数用于在 const 对象上获取 const 逆向迭代器。


string常用构造接口

接口声明与功能说明

接口声明功能说明
string();构造空的string类对象,即空字符串
string (const string& str);拷贝构造函数,用str拷贝构造string
string (const string& str, size_t pos, size_t len = npos);用str的pos位置后len长度的内容构造string对象(包括pos位置),如果len超过str长度则用pos位置后直到str末尾位置构造string对象,这里npos=-1
string (const char* s);用C-string来构造string类对象
string (const char* s, size_t n);用C-string来构造string类对象,内容为C-string前n个字符
string (size_t n, char c);string类对象中包含n个字符c
template string (InputIterator first, InputIterator last);使用迭代器范围 [first, last) 来构造一个新的string对象
string (initializer_list il);C++11后出现的构造接口,列表初始化string对象
string (string&& str) noexcept;C++11后出现的构造接口,移动构造string对象

接口演示

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1;
	string s2("hello world!");
	string s3(s2);
	string s4(s2,1,7);
	string s5("hello world",8);
	string s6(10,'a');
	string s7(s2, 2, 3);
	string s8{ "hello world" };
	string s9(string("hello world"));
	cout << "string();" <<"     " << s1 << endl;
	cout << "string (const char* s);" << "     " << s2<<endl;
	cout << "string (const string& str);" << "     " << s3<<endl;
	cout << "string (const string& str, size_t pos, size_t len = npos);" << "     " << s4<< endl;
	cout << "string (const char* s, size_t n);" << "     " << s5<<endl;
	cout << "string (size_t n, char c);" << "     " << s6<< endl;
	cout << "template string (InputIterator first, InputIterator last);" << "     " << s7<< endl;
	cout << "string (initializer_list il);" << "     " << s8<< endl;
    cout << "string (string&& str) noexcept;" << "     " <<s9 << endl;

	return 0;
}

RUN:
在这里插入图片描述


string类对象的容量操作

接口声明与功能说明

接口声明功能说明
size_t size() const;返回字符串有效字符长度
size_t length() const;返回字符串有效字符长度
size_t capacity() const;返回空间总大小
bool empty() const;检测字符串释放为空串,是返回true,否则返回false
void clear();清空有效字符
void reserve (size_t n = 0);为字符串预留空间
void resize (size_t n);将容量修改成n,不修改有效字符,多余部分填入’\0’
void resize (size_t n, char c);将有效字符的个数改成n个,多出的空间用字符c填充

接口演示

void testCapacity()
{
	string s1("hello world");
	cout << "size()"<< "     " << s1.size() << endl;
	cout << "length()"<<"     " << s1.length() << endl;
	cout << "capacity()" << "     " << s1.capacity() << endl;
	cout << "empty()" << "     " << s1.empty() << endl;


	string s2("hello");
	cout << "扩容前" << endl;
	cout << "reverse()前有效元素数" << "     " << s2.size() << endl;
	cout << "reverse()前容量大小" << "     " << s2.capacity() << endl;
	s2.reserve(50);
	cout << "reserve()扩容机制" << endl;
	cout << "reverse()后有效元素数" << "     " << s2.size() << endl;
	cout << "reverse()后容量大小" << "     " << s2.capacity() << endl;

	s2.reserve(0);
	cout << "reserve()缩容机制" << endl;
	cout << "reverse()后有效元素数" << "     " << s2.size() << endl;
	cout << "reverse()后容量大小" << "     " << s2.capacity() << endl;


	string s3("hello");
	cout << "扩容前" << endl;
	cout << "resize()前有效元素数" << "     " << s3.size() << endl;
	cout << "resize()前容量大小" << "     " << s3.capacity() << endl;
	s3.resize(50);
	cout << "resize()扩容机制" << endl;
	cout << "resize()后有效元素数" << "     " << s3.size() << endl;
	cout << "resize()后容量大小" << "     " << s3.capacity() << endl;


	s3.resize(0);
	cout << "resize()缩容机制" << endl;
	cout << "resize()后有效元素数" << "     " << s3.size() << endl;
	cout << "resize()后容量大小" << "     " << s3.capacity() << endl;


	s3.clear();
	cout << "clear()后有效元素数" << "     " << s3.size() << endl;
	cout << "clear()后容量大小" << "     " << s3.capacity() << endl;
}

RUN:
注意:这是在Windows平台进行演示
在这里插入图片描述

RUN:
注意:这是在Linux(CentOS发行版)平台进行演示

在这里插入图片描述

reverse与resize在不同平台下的扩容与缩容机制

  扩容:

  Windows平台
  每次扩容以合理倍数扩容

  Linux平台
  简单粗暴,扩容至指定大小

  缩容:

  Windows平台:
   reverse无缩容效果
  resize将有效字符修改至指定个数

  Linux平台:
  reverse把容量调整到有效字符数大小
  resize将有效字符修改至指定个数


string类对象的访问及遍历操作

接口声明与功能说明

接口声明功能说明
char& operator[] (size_t pos);返回pos位置的字符,可修改pos位置字符
const char& operator[] (size_t pos) const;返回pos位置的字符,不可修改pos位置字符
char& at (size_t pos);返回pos位置的字符,可修改pos位置字符
const char& at (size_t pos) const;返回pos位置的字符
char& back();获取字符串的最后一个字符,可修改
const char& back() const;获取字符串的最后一个字符,不可修改
char& front();获取字符串的第一个字符,可修改
const char& front() const;获取字符串的第一个字符,不可修改

接口演示

at与operator[] 的区别

  at与operator[] 的区别在于边界检测,at检测出错抛异常,operator[]检测出错程序报错
  at:

void testElementAccessAt() {
	string s1("abcde");
	try {
		cout << s1.at(7) << endl;
	}
	catch (...)
	{

	}
}

RUN:
在这里插入图片描述
  operator[] :

void testElementAccessOperator()
{
	string s1("abcde");
	cout << s1[7] << endl;
}

RUN:
熟悉的警告窗口在这里插入图片描述

back与front

  出现了string的鸡肋接口!对的string的鸡肋接口多的是,本文尽量较少的介绍这种鸡肋接口,大家了解一下即可。

void testElementAccess()
{
	string s1("abcde");
	cout << s1.front() << s1.back() << endl;
}

RUN:
在这里插入图片描述


string类对象的修改操作

接口名称功能说明
operator+=在字符串后追加字符串str
append在字符串后追加一个字符串
push_back在字符串后尾插字符c
insert在指定位置 pos 处插入字符或字符序列
erase删除指定位置的字符或字符范围
replace替换指定位置或字符范围的字符
swap交换两个对象内容
pop_back删除字符串中的最后一个字符
c_str返回C格式字符串
find从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

operator+=

string& operator+= (const string& str); //调用对象的末尾拼接一个str对象内容

string& operator+= (const char* s);//调用对象的末尾拼接一个s字符串内容

string& operator+= (char c);//调用对象的末尾拼接一个c字符

void test1()
{   
	string link("xxx");
	string s1;
	s1 += link;
	cout << s1 << endl;
	s1 += "yyy";
	cout << s1 << endl;
	s1 += 'z';
	cout << s1 << endl;
}

RUN:
在这里插入图片描述

append

string& append (const string& str);//将另一个对象的内容添加到当前字符串的末尾。

在这里插入图片描述

string& append (const string& str, size_t subpos, size_t sublen);//将另一个对象的subpos位置(包括subpos位置)后sublen长度的内容添加到当前字符串的末尾。

在这里插入图片描述

string& append (const char* s);//在当前字符串末尾添加一个字符串

在这里插入图片描述

string& append (const char* s, size_t n);//在当前字符串末尾添加一个字符串的前n个字符

在这里插入图片描述

string& append (size_t n, char c);//在当前字符串末尾添加n个c字符
在这里插入图片描述

template string& append (InputIterator first,InputIterator last);//在当前字符串末尾添加一个对象的迭代器区间[first, last) ,这个对象不局限于string对象,只要是数据类型相同的对象均可

在这里插入图片描述

push_back与pop_back

void push_back (char c);//在对象字符串末尾添加一个字符c
void pop_back();//删除对象的最后一个字符

在这里插入图片描述

insert

string& insert (size_t pos, const string& str);//在pos位置处插入一个对象内容
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);//在pos位置处插入一个对象的subpos位置后sublen长度的内容
在这里插入图片描述

string& insert (size_t pos, const char* s);//在pos位置处插入一个字符串内容
string& insert (size_t pos, const char* s, size_t n);//在pos位置处插入一个字符串的前n个字符
string& insert (size_t pos, size_t n, char c);//在pos位置处插入n个字符c
在这里插入图片描述

erase

string& erase (size_t pos = 0, size_t len =npos);
//删除字符串pos位置后len个字符,默认全部删除
iterator erase (iteratorp);
//删除一个迭代器位置,并返回一个指向删除后的下一个字符的迭代器
iterator erase (iterator first,iterator last);
//删除一个迭代器区间,并返回一个指向删除后的下一个字符的迭代器

在这里插入图片描述

replace

string& replace (size_t pos, size_t len, const string&str);
//将字符串的pos位置后len个字符替换为对象str内容
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_tsublen);
//将字符串的pos位置后len个字符替换为对象str的一个子区间内容在这里插入图片描述

string& replace (size_t pos, size_t len, const char* s);
//将字符串的pos位置后len个字符替换为字符串s内容
string& replace (size_t pos, size_t len, const char* s, size_t n);
//将字符串的pos位置后len个字符替换为字符串s的前n个字符内容
在这里插入图片描述

swap

void swap (string& str);
//交换两个对象内容
在这里插入图片描述

c_str

const char* c_str() const;//这个函数返回一个指向以 null 结尾的字符数组(C 字符串)的指针,表示当前字符串的内容,不可对指针内容修改。
在这里插入图片描述

find与rfind

注意:这里仅对find进行讲解,rfind与find唯一区别就是查找方向不同。

size_t find (const string& str, size_t pos = 0) const;//从pos位置开始寻找一个类,返回其首个字符位置
size_t find (const char* s, size_t pos = 0) const;//从pos位置开始寻找一个字符串,返回其首个字符位置
size_t find (char c, size_t pos = 0) const;//从pos位置开始寻找一个字符,返回其字符位置
以上三个接口查找内容失败均返回npos;
在这里插入图片描述

substr

string substr (size_t pos = 0, size_t len = npos) const;//取子串pos位置后len个字符,返回一个string类
在这里插入图片描述


string类非成员函数

以下函数在模拟实现时博主会再次进行介绍

接口功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> ()输入运算符重载
operator<<()输出运算符重载
getline ()获取一行字符串
relational operators大小比较

operator+

该接口就是某一数据与某一数据相加然后返回相加结果
在这里插入图片描述

relational operators

在这里插入图片描述

getline ()

istream& getline (istream& is, string& str, char delim);
//用于从输入流is中读取一行字符串,并将其存储在str中。函数会在遇到指定的分隔符delim或者到达输入流的末尾时停止读取,delim默认是’\n’(换行符)。
istream& getline (istream& is, string& str);//用于从输入流is中读取一行字符串,并将其存储在str中。函数会在遇到换行符时停止
  getline ()具体效果需要自己实践体验

#include <iostream>  
#include <string>  
  
int main() {  
    std::string line;  
    std::getline(std::cin, line); // 读取一行,直到遇到换行符  
    std::cout << "You entered: " << line << std::endl;  
  
    char delimiter = ':';  
    std::getline(std::cin, line, delimiter); // 读取一行,直到遇到冒号  
    std::cout << "You entered up to delimiter: " << line << std::endl;  
  
    return 0;  
}

vs和g++下string结构的说明

vs下string的结构

注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节。
  vs下string的结构
  string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字符串的存储空间:
    当字符串长度小于16时,使用内部固定的字符数组来存放
    当字符串长度大于等于16时,从堆上开辟空间

union _Bxty
{ // storage for small buffer or pointer to larger one
 value_type _Buf[_BUF_SIZE];
 pointer _Ptr;
 char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

  这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量最后:还有一个指针做一些其他事情。
故总共占16+4+4+4=28个字节。
在这里插入图片描述这种实现技术被称为短字符串优化(SSO,Short String Optimization)

短字符串优化(SSO,Short String Optimization)是 std::string 实现中常见的一种技术,用于优化小字符串的存储和性能。它的基本思想是将小字符串直接存储在 std::string 对象内部,而不是在堆上动态分配内存。这避免了小字符串在堆和栈之间频繁分配和释放的开销,同时减少了内存碎片。

实现上,std::string 对象内部通常会包含一个固定大小的缓冲区(比如15或22个字符的空间),用于直接存储短字符串。当字符串的长度小于或等于这个缓冲区的大小时,字符串的内容就直接存放在这个缓冲区里,不需要额外的动态内存分配。当字符串的长度超过缓冲区的大小时,std::string 就会在堆上动态分配内存来存储字符串的内容,并释放之前使用的缓冲区空间(如果有的话)。

g++下string的结构

  g++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:

空间总大小
字符串有效长度
引用计数
指向堆空间的指针,用来存储字符串


本章到此结束,感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553274.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目实现图形验证码(Hutool)

项目架构&#xff1a; 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 业务场景&#xff1a; 登录时使用验证码登录 1.1 打开hutool, 搜索 图片验证码 1.2后端编写生产验证码方法 1.3前端 1.3.1展示验证码 1.3.2 前端方法 1.3.2.1UU…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时&#xff0c;数据库是…

ubuntu 查询mysql的用户名和密码 ubuntu查看username

ubuntu 查询mysql的用户名和密码 ubuntu查看username 文章标签mysqlUbuntu用户名文章分类MySQL数据库 一.基本命令 1.查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.5 LTS Release: 16.04 Coden…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本&#xff1a;centos7 安装环境&#xff1a;vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…

BGP边界网关路由实验(华为)

一&#xff0c;技术简介 BGP&#xff08;边界网关路由协议&#xff09;是一种自治系统&#xff08;AS&#xff09;间的协议&#xff0c;主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合&#xff0c;这些设备可以在一个共同的管理域中协同工…

Netty-NioServerSocketChannel与NioSocketChannel

NioServerSocketChannel NioServerSocketChannel是netty服务端的channel。在ServerbootStrap的bind方法中&#xff0c;通过反射&#xff0c;实例化对象NioServerSocketChannel。   NioServerSocketChannel对象实例化的过程中。 AbstractChannel中实例化channel的id&#xff…

【QT进阶】Qt Web混合编程之QWebEngineView基本用法

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左&#xff0c;文本水平的效果-CSDN博客【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用-CSDN博客 【QT进阶】Qt Web混合编程之QWebEngi…

通过Idea部署Tomcat服务器

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

EFK环境搭建(基于K8S环境部署)

目录 一.环境信息二.安装nfs供应商三.安装elasticsearch四.安装kibana组件五.安装fluentd 一.环境信息 1.服务器及k8s版本 IP地址主机名称角色版本192.168.40.180master1master节点1.27192.168.40.181node1node1节点1.27192.168.40.182node2node2节点1.27 2.部署组件版本 序…

Python 数据结构和算法实用指南(二)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第四章&#xff1a;列表和指针结构 我们已经在 Python 中讨论了列表&#xff0c;它们方便而强大。通常情况下&#xff0c;我们使用 Python…

近端安全互联样例使用指导

样例介绍 本样例基于rk3568开发板&#xff0c;通过封装openharmony安全子系统deviceauth组件提供的能力&#xff0c;实现了一组可用于设备间快速建立可信认证和连接的接口&#xff0c;通过预先定义关系网&#xff0c;在设备初始化阶段完成端端设备间的认证&#xff0c;构建安全…

ES源码四:网络通信层流程

听说ES网络层很难&#xff1f;今天来卷它&#x1f604; 前言 ES网络层比较复杂&#xff0c;分为两个部分&#xff1a; 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块&#xff08;NetworkModule&#xff09; 入口还是上一章的创建Node构造方法的地方…

目标检测应用场景—数据集【NO.31】布匹数据集目标检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法&#xff0c; uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理&#xff0c; 通过接口获取数据&#xff0c;根据用户选择当前列选项设置子列数据&#xff0c;实现三级联动效果&#xff0c; 本示例中处…

【honggfuzz学习笔记】honggfuzz的基本特性

本文架构 1.动机2.honggfuzz的基本概念官网描述解读 3. honggfuzz的反馈驱动(Feedback-Driven)软件驱动反馈&#xff08;software-based coverage-guided fuzzing&#xff09;代码覆盖率代码覆盖率的计量单位 代码覆盖率的统计方式 硬件驱动反馈&#xff08; hardware-based co…

IDEA 安装、基本使用、创建项目

文章目录 下载基本使用修改颜色主题Keymap插件 创建项目创建模块新建 Java 类运行新建 Package打包 Jar运行 jar 包 查看文档 下载 官方下载地址&#xff1a;https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 这里我下载 macOS 社区版&#xff0c;IDEA 2024.1 (C…

60道计算机二级模拟试题选择题(含答案和解析)

点击下载《60道计算机二级模拟试题选择题&#xff08;含答案和解析&#xff09;》 1. 前言 本文设计了一份针对计算机二级考试的选择题&#xff0c;旨在考察考生对计算机基础知识和应用技能的掌握情况。试题涵盖了计算机基础知识、操作系统、办公软件、计算机网络等多个方面&…

【学习】Jmeter、postman、python如何与数据库相互配合

在当今数字化时代&#xff0c;数据库已经成为我们日常生活中不可或缺的一部分。无论是购物、社交还是工作&#xff0c;数据库都在默默地为我们提供着高效、稳定的服务。而在众多的技术工具中&#xff0c;Jmeter、Postman和Python成为了操作数据库的三大主流技术。今天&#xff…

虚拟机vm桥接模式linux(centos,ubuntu)联网

台式机网线 查看宿主机网络 编辑虚拟机—>虚拟网络编辑器–>更改设置 选择&#xff0c;确定 进入linux系统 输入ip addr找到自己的网卡 我的是eno16777736 centos&#xff1a; 编辑 HWADDR"00:0C:29:54:CE:B8" TYPE"Ethernet" BOOTPROTO"…
最新文章