C++——string容器常用操作汇总

news2024/11/17 7:49:08

在这里插入图片描述
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。

💬文章目录

    • 一.string容器基本概念
    • 二.string容器常用操作
      • ✅前言及函数参数的说明
      • 一.构造和析构
      • 二.string特性操作
      • 三.字符操作
      • 四.赋值操作
      • 五.拼接操作
      • 六.交换操作
      • 七.string截取操作(子容器)
      • 八.string的比较操作
      • 九.string的查找替换
      • 十.string的替换
      • 十一.string插入操作(insert)
      • 十二.string删除操作(erase)

一.string容器基本概念

C语言风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件。
string容器可以看做一片连续的储存空间,并用一个char*指向这片空间。string容器提供的迭代器是随机访问迭代器。
string和C风格字符串对比:

  • ✅字符串是一个char * 类型指针,string是一个类string封装了char * ,用来管理这个字符串,是一个char*型的容器。
  • ✅使用的时候,不必考虑内存分配和释放的问题: string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。
  • ✅动态管理内存(可扩展)
  • ✅提供了大量操作容器的API(函数接口,查找find,拷贝copy,删除delete 替换replace,插入insert等)。缺点是效率略有降低,占用的资源也更多。

二.string容器常用操作

✅前言及函数参数的说明

本篇文章📃只对构造函数的使用进行了举例,其他函数的使用和构造函数的使用十分相似,万变不离其宗。

string容器可以看做一片连续的储存空间,有两个用途,一是用作字符串,二是用作存放数据的容器,string容器的成员函数有12个分类,前七个既可以用作字符串也可以用于存放数据的容器,而后五个(判断字符串是否相等、查找、替换、插入、删除)主要用于操作字符串,如果是其他格式的数据,这些函数也可以用,但意义不大。
关于函数参数的说明:
size_t:

可以理解为无符号整型(unsigned int)。

npos:

静态常量成员string::npos为字符数组的最大长度(通常为unsigned int的最大值)。

NBTS(null-terminated string):

C风格的字符串(以空字符0结束的字符串)。

一.构造和析构

💬string类有七个构造函数(C++11新增了两个)表格一览:

函数原型解释
string();创建一个长度为0的string对象(默认构造函数)
string(const char *s);string对象初始化为s指向的NBTS(转换构造函数)。
string(const string &str);使用string对象str去初始化新创建的string对象(拷贝构造函数)。
string(const char *s,size_t n);将string对象初始化为s指向的地址后n字节的内容。
string(const string &str,size_t pos=0,size_t n=npos);将sring对象初始化为str从位置pos开始到结尾的字符(或从位置pos开始的n个字符)
template string(T begin,T end);将string对象初始化为区间[begin,end]内的字符,其中begin和end是迭代器,其行为就像指针,用于指定位置,范围包括begin在内,但不包括end。
string(size_t n,char c);创建一个由n个字符c组成的string对象。析构函数~string()释放内存空间。
~string();创建一个长度为0的string对象(默认构造函数)。

1)string();创建一个长度为0的string对象(默认构造函数)

#include <iostream>
#include<string>
using namespace std;
int main()
{
     // 1)string():创建一个长度为0的string对象(默认构造函数)。
    string s1; // 创建一个长度为0的string对象
    cout << "s1=" << s1 << endl; // 将输出s1=,因为容器是空,所以输出是空。
    cout << "s1.capacity()=" << s1.capacity() << endl; // 返回当前容量,可以存放字符的总数。
    cout << "s1.size()=" << s1.size() << endl; // 返回容器中数据的大小。
}

string类的capacity方法,用于获取当前容器容量,意思是,如果不重新分配内存,所能存放字符的总数。
string类的size方法,用于获取容器中数据的大小,意思是里面已经存放了多少数据。
在这里插入图片描述

容器的当前容量是15,存放数据大小0,为什么当前容量不是0,而是15?
往string容器中存放数据时,如果数据多大就分配多少内存的空间,那么每次扩展容器内存时,都要重新分配和释放内存,效率很低,所以合理的做法就是预先分配比数据实际大小更多的空间。避免过于频繁的分配和释放内存。
还有,创建容器的时候,如果数据量小于15字节,就分配15字节,就算是空的,也分配15字节。
那我们再写几行代码,存放的数据,超过字节,这样的话,容器会做一次拓展。

int main()
{
    // 1)string():创建一个长度为0的string对象(默认构造函数)。
    string s1; // 创建一个长度为0的string对象
    cout << "s1=" << s1 << endl; // 将输出s1=
    cout << "s1.capacity()=" << s1.capacity() << endl; // 返回当前容量,可以存放字符的总数。
    cout << "s1.size()=" << s1.size() << endl; // 返回容器中数据的大小。
    cout << "容器动态数组的首地址=" << (void *)s1.c_str() << endl;
    s1 = "xxxxxxxxxxxxxxxxxxxx";
    cout << "s1.capacity()=" << s1.capacity() << endl; // 返回当前容量,可以存放字符的总数。
    cout << "s1.size()=" << s1.size() << endl; // 返回容器中数据的大小。
    cout << "容器动态数组的首地址=" << (void *)s1.c_str() << endl;
}

在这里插入图片描述

容器做了一次拓展,拓展后大小为字节
并且两个容器的首地址不同,string类拓展容器时,先分配更大的空间,然后把内容复制到新的空间,再把以前的空间释放掉。所以两个容器的地址肯定不一样。

2)string(const char *s); //使用C语言风格的字符串s初始化string对象。(转换构造函数)
例如:

int main()
{
    string s2("hello world");
    cout << "s2=" << s2 << endl; // 将输出s2=hello world
    string s3 = "hello world";
    cout << "s3=" << s3 << endl; // 将输出s3=hello world
}

在这里插入图片描述

3)string(const string &str); // 使用string对象str去初始化新创建的string对象(拷贝构造函数)。

int main()
{
    string s3 = "hello world";
    string s4(s3); //调用拷贝构造函数,s3 = "hello world";
    cout << "s4=" << s4 << endl; // 将输出s4=hello world
    string s5 = s3;//调用拷贝构造函数
    cout << "s5=" << s5 << endl; // 将输出s5=hello world
}

在这里插入图片描述

s4和s5的内容都是从s3拷贝过来的。
注意string类中有一个指向动态数组的char*指针,所以string的拷贝构造函数一定是深拷贝。
string的拷贝构造函数中,前三个用的最多,后面4个,在实际开发,特别是处理文件和网络编程时,用的很多。

4)string(const char *s,size_t n); // 将string对象初始化为s指向的地址后n字节的内容。即使超过了C语言风格的字符串长度,只要小于n字节,后面的数据照样被复制。

🖲例如:

int main()
{
    string s6("hello world", 5);//s6将指向h首字符后5字节
    cout << "s6=" << s6 << endl; // 将输出s6=hello
    string s7("hello world", 50);//s7将指向h首字符后50字节的内容,
    cout << "s7=" << s7 << endl; //将输出s7=hello以及未知内容
}

在这里插入图片描述
对于字符串s7,如果遇到字符串的结尾/0,并不会停止复制。
在这里插入图片描述

5)string(const string &str,size_t pos=0,size_t n=npos); 从str的第pos位置开始,截取n个字符,用截取的内容创建string容器。
✅第一个参数是string对象,也可以是C语言风格的字符串,因为C++的string类内置了转换函数,可以将C语言的字符串风格给自动转换成string对象
✅第二个参数的缺省值是0,不是1。
✅第三个参数npos的缺省值是无限大。不指定npos就是截取pos位置后面的所有内容。

🖲例如:

int main()
{
    string s3 = "hello world"; 
    string s8(s3, 3, 5); // s3 = "hello world";
    cout << "s8=" << s8 << endl; // 将输出s8=lo wo
    
    string s9(s3, 3);//截取从s3字符串第3个位置的后的全部内容
    cout << "s9=" << s9 << endl; // 将输出s9=lo world
    cout << "s9.capacity()=" << s9.capacity() << endl; // 返回当前容量,可以存放字符的总数。
    cout << "s9.size()=" << s9.size() << endl; // 返回容器中数据的大小。
    cout << "s9.capacity()=" << s9.capacity() << endl; // 返回当前容量,可以存放字符的总数。
    cout << "s9.size()=" << s9.size() << endl; // 返回容器中数据的大小。
 
    //C++的string类内置了转换函数,可以将C语言的字符串风格给自动转换成string对象
    string s10("hello world", 3, 5);
    cout << "s10=" << s10 << endl; // 将输出s10=lo wo
}

注意这个构造函数和第四个不一样,它会判断str的结尾标志/0,然后停止,并不会无限的复制下去。上例对于s9字符串,从s3的第3个位置截取npos(无限大)个字符,并没有真正截取无限个字符,只截取了8个字符,遇到/0就停止了,所以s9容器的大小为8。
在这里插入图片描述

6)template string(T begin,T end); // 将string对象初始化为区间[begin,end]内的字符,其中begin和end的行为就像指针,用于指定位置,范围包括begin在内,但不包括end。

例如:

int main()
{
    string s13 = "强风吹拂king";
    string s14(s13.begin(), s13.end());
    cout << "构造出来的字符串s14:" << s14 << endl;
    return 0;
}

在这里插入图片描述

7)string(size_t n,char c); // 创建一个由n个字符c组成的string对象。
🖲例如:

int main()
{
    string s12(8, 'x');
    cout << "s12=" << s12 << endl; // 将输出s12=xxxxxxxx
    cout << "s12.capacity()=" <<
    s12.capacity() << endl; // s12.capacity()=15
    cout << "s12.size()=" << s12.size() << endl; // s12.size()=8
    string s13(30, 0);
cout << "s13=" << s13 << endl; // 将输出s13=
    cout << "s13.capacity()=" <<
    s13.capacity() << endl; // s13.capacity()=31
    cout << "s13.size()=" << s13.size() << endl; // s12.size()=30
}

在这里插入图片描述

析构函数~string()释放内存空间。

二.string特性操作

💬特性函数表格一览:

函数原型解释
size_t max_size() const;返回string对象的最大长度string::npos,此函数意义不大。
size_t capacity() const;返回当前容量,可以存放字符的总数。
size_t length() const;返回容器中数据的大小(字符串语义)。
size_t size() const;返回容器中数据的大小(容器语义)。
bool empty() const;判断容器是否为空。
void clear();清空容器,清空后,size()将返回0。
void shrink_to_fit();将容器的容量降到实际大小(需要重新分配内存)。
void reserve( size_t size=0);将容器的容量设置为至少size。
void resize(size_t len,char c=0);把容器的实际大小置为len,如果len<实际大小,会截断多出的部分;如果len>实际大小,就用字符c填充。resize()后,length()和size()将返回len。

三.字符操作

💬表格一览:

函数原型解释
char& operator[](int n);通过[]方式取字符,通过[]访问元素,如果越界,不抛异常,程序直接挂掉
char& at(int n);通过at方法获取字符,如果越界,会抛异常
const char *c_str() const;返回容器中动态数组的首地址,语义:寻找以null结尾的字符串。
const char *data() const;返回容器中动态数组的首地址,语义:只关心容器中的数据。
int copy(char *s, int n, int pos = 0) const;把当前容器中的内容,从pos开始的n个字节拷贝到s中,返回实际拷贝的数目。
具体使用方法:
#include <iostream>
#include<string>
using namespace std;
int main()
{
	string s = "hello world";
	for (int i = 0; i < s.size(); i++)
	{
		cout << s[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < s.size(); i++)
	{
		cout << s.at(i) << " ";
	}
	cout << endl;
}

关于[]和at异常的问题:
char& operator[](int n);函数

#include <iostream>
#include<string>
using namespace std;
int main()
{
	string s = "hello world";
    try
	{
		cout << s[100] << endl;
	}
	catch (out_of_range &ex)
	{
		cout << ex.what() << endl;
	}
}

char& at(int n);函数

#include <iostream>
#include<string>
using namespace std;
int main()
{
	string s = "hello world";
    try
	{
		cout << s.at(100) << endl;
	}
	catch (out_of_range &ex)
	{
		cout << ex.what() << endl;
		cout << "at越界" << endl;
	}
}

四.赋值操作

给已存在的容器赋值,将覆盖容器中原有的内容。
💬表格一览:

函数原型解释
string& operator=(const char* s);C语言风格字符串赋值给当前的string对象
string& operator=(const string&s);把string对象s赋给当前的string对象
string& operator=(char c);字符c赋值给当前的string对象
string& assign(const char *s);将C语言风格字符串s赋给当前的string对象
string &assign(const char *s,size_t n);把C语言风格字符串s的前n个字符赋给当前的string对象
string& assign(const string& str);把string对象str赋给当前的string对象
string& assign(size_t n,char c);用n个字符c赋给当前的string对象
string& assign(const string &str,size_t pos=0,size_t n=npos);将当前的string对象赋值为str从位置pos(缺省值为0,默认为首部)开始到n(缺省值npos,即默认为结尾)

五.拼接操作

把内容追加到已存在容器的后面。
表格一览:

函数原型解释
string& operator+=(const string& str);重载+=操作符,将string对象str连接到当前string对象后。
string& operator+=(const char* s)重载+=操作符,将C语言风格字符串s连接到当前string对象后。
string& operator+=(const char c);重载+=操作符,将字符c连接到当前string对象后。
string& append(const char *s);把C语言风格字符串s连接到当前string对象结尾。
string &append(const char *s,size_t n);把C语言风格字符串s的前n个字符连接到当前string对象结尾。
string& append(const string&str);将string对象str连接到当前string对象后。
string& append(const string& s, int pos, int n);把string对象s中从pos开始的n个字符连接到当前string对象结尾。
string &append(size_t n,char c);在当前string容器结尾添加n个字符c。

六.交换操作

💬表格一览:

函数原型解释
void swap(string &str);把当前容器与str交换。
如果数据量很小,交换的是动态数组中的内容,如果数据量比较大,交换的是动态数组的地址。

七.string截取操作(子容器)

💬表格一览:
substr函数参数pos的缺省参数默认为0,即首部,参数n缺省参数默认为npos,即尾部。

函数原型(substr)解释
string substr(size_t pos = 0,size_t n = npos) const;返回pos开始的n个字节组成的子容器。

八.string的比较操作

表格一览:
compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。

函数原型解释
bool operator==(const string &str1,const string &str2) const;比较两个字符串是否相等
int compare(const string& str) const;当前字符串与字符串str比较
int compare(size_t pos, size_t n,const string& str) const;比较当前字符串从pos开始的n个字符组成的字符串与str的大小
int compare(size_t pos, size_t n,const string &str,size_t pos2,size_t n2)const;比较当前字符串从pos开始的n个字符组成的字符串与str中pos2开始的n2个字符组成的字符串的大小
int compare(const char *s) const;当前字符串与C语言风格字符串s比较
int compare(size_t pos, size_t n,const char *s) const;比较当前字符串从pos开始的n个字符组成的字符串与C语言风格字符串s的大小
int compare(size_t pos, size_t n,const char *s, size_t pos2) const;比较当前字符串从pos开始的n个字符组成的字符串与C语言风格字符串s中从pos2位置开始的n个字符组成的字符串的大小

九.string的查找替换

💬find函数表格一览:
find函数参数pos的缺省值是0,即默认从头开始查找。

函数原型 (find)解释
size_t find(const string& str, size_t pos = 0) const;查找str第一次出现位置,从pos位置开始查找。
size_t find(const char* s, size_t pos = 0) const;查找C语言风格字符串s第一次出现位置,从pos开始查找。
size_t find(const char* s, size_t pos, size_t n) const;从pos位置开始查找字符串s的前n个字符第一次出现的位置
size_t find(char c, size_t pos = 0) const;查找字符c第一次出现位置。

💬rfind函数表格一览:
rfind函数参数pos缺省参数为npos,即默认从尾部开始查找。

函数原型解释
size_t rfind(const string& str, size_t pos = npos) const;查找str第一次出现的位置,从pos位置开始查找
size_t rfind(const char* s, size_t pos = npos) const;查找C语言风格字符串s第一次出现位置,从pos位置开始查找
size_t rfind(const char* s, size_t pos, size_t n) const;从pos位置开始查找C语言风格字符串s的前n个字符第一次出现位置
int rfind(const char c, int pos = 0) const;查找字符c第一次出现的位置

十.string的替换

💬replace函数表格一览:

函数原型(replace)解释
string& replace(size_t pos, size_t len, const string& str);从pos位置开始len长度的内容被替换为字符串str
string& replace(size_t pos, size_t len, const char* s);从pos开始len长度的内容被替换为C语言风格字符串s。
string& replace(size_t pos, size_t len, const string& str, size_t subpos, size_t sublen = npos);从pos位置开始len长度的内容被替换为string对象str从位置subpos到sublen的内容。
string& replace(size_t pos, size_t len, const char* s, size_t n);从pos位置开始len长度的内容被替换为C语言风格字符串s前n个字符大小的内容。
string& replace(size_t pos, size_t len, size_t n, char c);从pos位置开始len长度的内容被n个字符c替换。

十一.string插入操作(insert)

💬insert函数一览:

函数原型解释
string& insert(size_t pos, const char* s);在pos位置插入C语言风格字符串s
string& insert(size_t pos, const char* s, size_t n);在pos位置插入C语言风格字符串s前n个字符大小的内容。
string& insert(size_t pos, const string& str);在pos位置插入str
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen = npos);在pos位置插入string对象str从位置subpos到位置sublen大小的内容
string& insert(size_t pos, size_t n, char c);在pos位置插入n个字符c

十二.string删除操作(erase)

💬erase函数一览:

函数原型解释
string& erase(int pos, int n = npos);删除从pos开始的n个字符

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu安装gcc和g++图文教程

文章目录 一、gcc 和 g介绍二、ubuntu安装gcc和g三、gcc和g的选项总结 一、gcc 和 g介绍 GCC&#xff08;GNU Compiler Collection&#xff09;是由GNU项目开发的一套广泛使用的开源编译器集合。它支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada和其他语言…

基于python深度学习的水果或其他物体识别小程序

效果图如下&#xff1a; 代码演示和demo仓库看b站视频003期&#xff1a; 到此一游7758258的个人空间_哔哩哔哩_bilibili 代码展示&#xff1a; 数据集图片放置在data文件夹下&#xff0c;大家可以根据自己需要比如识别其他物体&#xff0c;只需要模仿data文件夹下的文件命名放…

浅谈基于分项计量的校园能源监管平台解决方案设计

张心志 关注acrelzxz 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;伴随着我国经济的飞速发展&#xff0c;国家机关办公建筑和大型公共建筑高耗能的问题日益突出&#xff0c;如何解决建筑能耗己成为一个国家总能耗的重要组成部分。学校是肩负着教育、科研和社会服…

Oracle中的连接方式

Oracle中的连接方式 对于数据库中表与表之间的连接&#xff08;内连接、外连接&#xff09;都可以看成集合之间的运算操作。 内连接 select * from a_table a inner join b_table b on a.id b.id; 相当于求两个集合中满足条件的结果&#xff0c;即交集。 外连接 左/外连接&a…

计算机性能

计算机性能 计算机性能描述 计算机性能测试程序 计算机性能速度指标 计算机性能计算 设1号计算机执行任务耗时3s,2号计算机执行任务耗时2s&#xff0c;则有 P11/3 P21/2 则相对性能比为 P1/P22/3 &#xff08;p1的性能为p2性能的2/3&#xff09;&#xff0c;因为P1/P2 < …

软考A计划-系统集成项目管理工程师-项目范围管理(一)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Echarts折线图折线呈现为渐变线条

想要如图所示的折线图&#xff0c;折线线条为渐变颜色&#xff0c;两边颜色接近区域面积的颜色&#xff0c;中间颜色亮度高一些&#xff0c;在series中使用lineStyle&#xff0c;将其color设置为渐变色&#xff1a; option {xAxis: {type: category,data: [Mon, Tue, Wed, Th…

ModaHub魔搭社区:向量数据库Milvus性能优化问题(二)

目录 为什么有时候小的数据集查询时间反而更长&#xff1f; 为什么查询时 GPU 一直空闲&#xff1f; 为什么数据插入后不能马上被搜索到&#xff1f; 为什么我的 CPU 利用率始终不高&#xff1f; 创建集合时 index_file_size 如何设置能达到性能最优&#xff1f; 为什么有…

0基础学习VR全景平台篇 第53篇:专业版功能-离线导出!

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;专业版功能-离线导出&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 离线导出&#xff0c;指的是将VR漫游作品通过下载的方式&#xff0c;保存到本…

YOLOv5/v7 添加注意力机制,30多种模块分析⑦,CCN模块,GAMAttention模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、CCN模块1、CCN模块的原理2、实验结果3、应用示例 三、GAMAttention模块1、GAMAttention模块的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本…

FreeRTOS内核API速览

FreeRTOS内核API速览 信号量创建信号量计数信号量互斥信号量二值信号量 释放信号量任务模式中断模式 获取信号量任务模式中断模式 消息队列创建队列发送消息任务模式中断模式 获取消息任务模式中断模式 软件定时器创建定时器启动定时器停止定时器复位定时器删除定时器改变定时器…

我的创作纪念日:从前那个看文章的人,如今已经成为了写文章的人.

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 金句分享:…

【高级飞行功能】DJI AIR 2S

一、飞行动作 1.1飞行动作 螺旋飞行动作 如果风速比较大&#xff0c;可以采用螺旋飞行动作 环绕飞行&#xff08;飞机云台是对着主体的&#xff09; 环绕飞行与速度和环绕半径有关&#xff1b; 环绕半径越小&#xff0c;要求速度越慢环绕时&#xff0c;偏离主体中心&#xff0…

douyin23.9 deviceid和iid设备注册分析

使用23.9版本进行注册&#xff08;版本多少 其实没有那么重要&#xff09; 老生常谈&#xff0c;老规矩注册接口device_register不能少吧&#xff0c;然后要检测设备app_alert_check吧&#xff0c;之后要发app_log日志包吧。 当然除了只有这些接口肯定是不行啦&#xff0c;加密…

nmcli命令练习

一、为一个网卡添加或者删除另外一个IP地址 #为ens160这张网卡添加另一个ip nmcli connection modify ens160 ipv4.address 192.168.33.136/24#使添加或者删除的IP生效 nmcli connection up ens160#删除ens160这张网卡的IP nmcli connection modify ens160 -ipv4.address 192.…

Java程序会产生死锁?如何定位、修复?

文章目录 死锁的概念死锁定位实战模拟问题定位使用 jstack使用JConsole使用 Java 提供的标准管理 API 死锁的概念 死锁是一种特定的程序状态&#xff0c;在实体之间&#xff0c;由于循环依赖导致彼此一直处于等待之中&#xff0c;没有任何个体可以继续前进。死锁不仅仅是在线程…

Redis - Reactor 模式的事件驱动源码解析

前言 本篇将介绍 redis 服务器中 I/O 复用的具体应用。 redis 服务器将所有需处理的事件抽象为两种事件&#xff1a; 文件事件。redis 服务器是通过 Socket 与客户端进行连接和通信的。文件事件就是服务器对 Socket 的 I/O 操作的一种抽象&#xff0c;包括 accept、recv、sen…

Windows 解决cmd/dos窗口中文乱码问题

文章目录 一、问题描述二、解决方案1. 更改DOS窗口代码页方式1&#xff1a;更改dos窗口代码页&#xff08;临时有效&#xff09;方式2&#xff1a;修改注册表CodePage项&#xff08;永久有效&#xff09;方式3&#xff1a;修改 .lnk 快捷方式的文件属性&#xff08;永久有效&am…

Minkube部署单节点kubernetes-1.23.7

minikube是一个快速构建单节点kubernetes的一个工具&#xff0c;用于快速构建本地测试和开发环境。 1、关闭防火墙和selinux systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i /SELINUX/s/enforcing/disabled/g /etc/selinux/config 2…

Vue 项目中使用WebSocket 消息推送

一、功能需求 1.这是我在后台管理项目中使用到的&#xff0c;主要的作用是搞一个消息提醒的功能。 2.主要有右上角的提示和有下角的消息弹框。 3.主要实现的功能是如果用户有未读的消息&#xff0c;那么首次登录就弹框&#xff0c;如果用户关闭了页面&#xff0c;那么再次刷新…