string【1】介绍与使用(超详解哦)

news2024/12/24 2:55:53

string的介绍与使用

  • 引言
  • string类常用接口
    • 构造函数
    • 容量操作
      • size与length
      • capacity
      • resize
      • reserve
      • clear
      • empty
    • 元素访问
      • 迭代器访问
        • begin
        • end
        • rbegin
        • rend
        • 范围for
      • 下标访问
    • 字符串修改
      • insert
      • append
      • push_back
      • operator+=
      • pop_back
      • erase
    • 字符串查找
      • find
      • rfind
    • 非成员函数
      • operator>>
      • operator<<
  • 总结

引言

在C语言部分,我们对于字符串的操作经常借助C标准库提供的一系列操作字符串的库函数(strlen等)来实现的。
但是,这样去操作字符串,函数与其操作的字符串是分离的,不符合面向对象的思想,使用时较为麻烦;而且需要自己管理底层的空间,容易导致越界访问的问题。

在C++标准库中提供了管理字符串的string类,封装了方法与元素使操作字符串时更加方便:
在这里插入图片描述

  1. strings是表示字符序列的对象
  2. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traitsallocator作为basic_string的默认参数
  3. ……(后面会详细介绍)

使用string类时,必须包含#include<string>头文件以及using namespace std;
string文档详解

string类常用接口

string类的元素其实与之前实现的顺序表类似,包括一个指针指向存储数据的空间(_date)、另两个数字表示元素个数(_size)与容量(_capacity

构造函数

在这里插入图片描述
string的构造方式有许多,包括无参构造、拷贝构造、C字符串构造、字符串中部分构造等:
在这里插入图片描述

例如:

//测试各种string的构造重载

int main()
{
	//无参构造s1
	string s1;
	cout << "1: " << s1 << endl;
	//使用C字符串(字符串常量)构造s2
	string s2("hello qqq");
	cout << "2: " << s2 << endl;
	//使用string对象s2拷贝构造s3
	string s3(s2);
	cout << "3: " << s3 << endl;
	//使用s2从下标为6的位置后的字符构造s4
	string s4(s2, 6);
	cout << "4: " << s4 << endl;
	//使用常量字符串的前5个字符构造s5
	string s5("abcdef", 5);
	cout << "5: " << s5 << endl;
	//使用6个字符'q'构造s6
	string s6(6, 'q');
	cout << "6: " << s6 << endl;
	//使用s6首尾位置的迭代器构造s7
	string s7(s6.begin(), s6.end());
	cout << "7: " << s7 << endl;
	return 0;
}

在这里插入图片描述
接下来就逐一说明:

  • 在这里插入图片描述
    无参构造了一个string对象s1,所以打印s1时没有显示内容;
    在前面的内容中已经对类和对象有了一定的了解,使用cout << s1 << endl;打印类对象实际是 <<运算符重载

  • 在这里插入图片描述
    使用常量字符串"hello qqq"构造对象s2

  • 在这里插入图片描述
    拷贝构造,使用类对象s2拷贝构造s3

  • 在这里插入图片描述
    在这里插入图片描述
    使用类对象s2从下标为6的位置以后的元素构造s4,第三个参数使用缺省参数;
    这个构造函数的重载形式是有三个参数:const string& strsize_t possize_t len = npos,表示用str类中从pos位置开始的len个字符构造一个新类对象。len是一个缺省参数,缺省值为npos,string中定义npos的值为-1,放在一个无符号数len中就将是一个很大的数,即表示用从pos位置以后的所有元素构造

  • 在这里插入图片描述
    使用常量字符串"abcdef"的前5个字符构造s5, 即"abcde"

  • 在这里插入图片描述
    使用6个字符'q'构造string对象s6

  • 在这里插入图片描述
    在这里插入图片描述
    使用迭代器区间,从s6.begin()s6.end()来构造s7这个区间是左闭右开的
    迭代器iterator,提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节,使用时类似于指针(string中就是指针)。 这里的构造重载是一种模板,这意味着不仅可以使用string的迭代器区间来构造string对象。

容量操作

对于容量的操作,就是对成员变量_size_capacity的操作,这里只介绍常用的几种
在这里插入图片描述

size与length

在这里插入图片描述
在这里插入图片描述
size()length()的作用都是求string对象中的数据长度,他们的返回值相同,但是由于历史版本原因存在两个成员函数。

int main()
{
	string s1("abcdefg");
	cout << s1.size() << endl;
	return 0;
}

在这里插入图片描述

需要注意的是:string对象与C字符串不同,C字符串以'\0'为结束标志,所以在使用strlen计算字符串长度时是以'\0'为结束标志的;而对于string,没有结束标志,它的长度其中存储的字符的个数,也就是其属性_size的值
例如当string对象存储的字符序列中存在'\0'

int main()
{
	string s1("abcdefg");
	s1 += '\0';
	s1 += "666666";
	cout << s1.size() << endl;
}

在这里插入图片描述

可以通过resize()函数来改变string中元素个数

capacity

capacity()用于查看string对象的容量
在这里插入图片描述

int main()
{
	string s1("abcdefg");
	cout << s1.capacity() << endl;
	return 0;
}

在这里插入图片描述

capacity的值会大于等于size的值,容量大于等于元素个数,这不难理解。

当我们修改string对象中的字符序列时,可能会出现修改后的size大于capacity的情况,这时就会发生扩容。扩容一般为一倍或一点五倍扩(不同环境下不同)。但是容量大小不会大于size的理论最大值,这个值可以通过max_size函数查到,不同环境下的值会有不同。

vs2019下扩容演示(1.5倍):

int main()
{
	string s1;
	size_t old = 0;
	while (s1.capacity() <= 128)
	{
		s1 += '6';
		if (old != s1.capacity())
		{
			cout << s1.capacity() << endl;
			old = s1.capacity();
		}
	}
	return 0;
}

在这里插入图片描述

resize

resize用于修改string对象字符序列的元素个数,即_size的值
在这里插入图片描述
resize函数有两个重载版本,可以将string对象的字符个数改为n
n小于原string对象的_size时,将保留原对象的前n个字符,_size的值为n
n大于原string对象的_size时,将保留原字符,超出原_size的部分使用传参指定的字符c补足,若未传参,使用'\0'补足。

int main()
{
	//使用常量字符串初始化string对象s1
	string s1("abcde");
	cout << s1 << " " << s1.size() << endl;
	//将s1元素个数删到3
	s1.resize(3);
	cout << s1 << " " << s1.size() << endl;
	//使用字符!将s1元素个数增加到10
	s1.resize(10, '!');
	cout << s1 << " " << s1.size() << endl;
	return 0;
}

在这里插入图片描述

reserve

reserve用于修改string对象的容量,即_capacity的值
在这里插入图片描述
reserve接收一个size_t型的参数n,表示将string对象的容量扩展至n个字符(或大于n个字符),函数并不会改变string字符序列的长度(元素个数)。

(当n的值小于原对象的容量时,函数行为取决于容器实现,但最后的容量一定大于n的值)

int main()
{
	//使用常量字符串初始化string对象s1
	string s1("abcde");
	cout << s1 << " " << s1.capacity() << endl;
	//将s1扩容至50
	s1.reserve(50);
	cout << s1 << " " << s1.capacity() << endl;
	//将s1缩容至20
	s1.reserve(20);
	cout << s1 << " " << s1.capacity() << endl;
	//将s1缩容至10
	s1.reserve(10);
	cout << s1 << " " << s1.capacity() << endl;
	return 0;
}

在这里插入图片描述
在上面的测试中,当使用reserve扩容s1为50时,容量增大到了63;缩容s1为20时,容量没有缩小;缩容s1为10时,容量缩小到了15。均符合上面的叙述。

clear

clear可以清理string对象的字符序列,使其元素个数为0
在这里插入图片描述

int main()
{
	string s1("abcdef");
	cout << s1 << " " << s1.size() << endl;
	s1.clear();
	cout << s1 << " " << s1.size() << endl;
	return 0;
}

在这里插入图片描述

empty

empty用于判断string对象的字符序列是否为空
在这里插入图片描述

int main()
{
	string s1("abcdef");
	cout << s1 << " " << s1.empty() << endl;
	//清理string后,判断其是否为空
	s1.clear();
	cout << s1 << " " << s1.empty() << endl;
	return 0;
}

在这里插入图片描述

元素访问

在类和对象部分我们知道,在类外是不能访问类对象的属性的,但是对于string类,可以通过一些方式来访问string中的字符序列的元素:

迭代器访问

迭代器(iterator)提供一种通用的方法,使其能够依序访问某个容器所含的各个元素,而又无需暴露该容器的内部表达方式。

迭代器的使用与指针类似,可以定义一个对于某个容器的迭代器变量,它指向该容器类型的对象中的某一元素。这意味着迭代器支持类似于指针的解引用*访问成员->加减+- 等操作。

对于string来说,它迭代器的类型为string::iterator,表示这是对于string的迭代器类型,它就可以指向string对象字符序列中的某个元素(对于string来说迭代器底层就是原生指针):

int main()
{
	string s1("abcdef");
	//使用begin函数返回其第一个字符的迭代器
	string::iterator it = s1.begin();
	cout << *it << endl;
	return 0;
}

在这里插入图片描述
有一些接口可以帮助我们使用迭代器:

begin

begin可以返回string对象中指向第一个元素的迭代器
在这里插入图片描述
通过begin函数返回的迭代器,可以访问string对象中的首元素,当然这个迭代器+1就可以访问下一个元素

int main()
{
	string s1("abcdef");
	//使用begin函数返回其第一个字符的迭代器
	string::iterator it = s1.begin();
	cout << *it << endl;
	//it迭代器自增1,指向下一个元素
	++it;
	cout << *it << endl;
	return 0;
}

在这里插入图片描述

end

end可以返回string对象尾元素的下一个位置的迭代器
在这里插入图片描述
前面提到过,迭代器构成的区间是左闭右开的,所以作为整个字符序列的尾,应该指向的是尾元素的下一个位置。所以对这个返回值解引用就是非法访问,就会导致程序崩溃。

这个方法常用于与begin结合,遍历整个string对象的字符序列:

int main()
{
	string s1("abcdef");
	string::iterator it = s1.begin();
	while (it < s1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

rbegin

rbegin返回一个sting对象尾元素的反向迭代器
在这里插入图片描述
反向迭代器 reverse_iterator,与正向迭代器相反,+1是向前移动,-1是向后移动,不难理解,使用反向迭代器就可以实现倒着遍历string对象。

rbegin的返回值解引用就是sting对象的尾元素:

int main()
{
	string s1("abcdef");
	//使用rbegin函数返回其最后一个个字符的反向迭代器
	string::reverse_iterator rit = s1.rbegin();
	cout << *rit << endl;
	//反向迭代器自增,向前移动
	++rit;
	cout << *rit << endl;
	return 0;
}

在这里插入图片描述

rend

rend返回一个string对象首元素前的位置的反向迭代器

在这里插入图片描述
rend返回的就是倒着遍历string对象时,迭代器区间的右边,是一个开区间,所以指向的是首元素前的位置。

对其解引用就会崩溃,常用于与rdegin结合倒序遍历string对象:

int main()
{
	string s1("abcdef");
	string::reverse_iterator rit = s1.rbegin();
	while (rit < s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

范围for

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号 :分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

范围for可以让我们更简洁的遍历容器中的元素,它依赖迭代器实现:

int main()
{
	string s1("abcdef");
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
auto是一种新的类型指示符,可以简化繁琐的类型名的书写,在编译阶段auto会替换为变量的实际类型

当然,范围for这里的auto也可由我们已知的类型(元素的类型)替换:

int main()
{
	string s1("abcdef");
	for (char e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

当需要在范围for中修改元素的值时,在类型后加上&即可

int main()
{
	string s1("abcdef");
	for (char& e : s1)
	{
		++e;
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

下标访问

使用[]用下标访问string中的元素,实际是运算符重载operator[]的函数调用
在这里插入图片描述
用法上与数组的下标访问类似,不过该方法会做越界检查,而数组的越界会崩溃:

int main()
{
	string s1("abcdef");
	for (int i = 0; i < 6; ++i)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

字符串修改

string提供了一些方法来管理其中的字符序列:

insert

insert可以实现在string对象的pos位置插入一些字符

在这里插入图片描述
insert有许多的重载版本,包括在pos位置插入一个string对象(的部分)、插入一个C字符串(的前n个元素怒)、插入若干个指定字符、在迭代器位置添加若干字符、在迭代器位置添加一块迭代器区间的数据等等:

int main()
{
	string s("ghijkl");

	//在s1的第4个元素的位置插入string对象s
	string s1("abcdef");
	s1.insert(3, s);
	cout << "1: " << s1 << endl;

	//在s2的第四个位置插s的第3个位置的3个元素
	string s2("abcdef");
	s2.insert(3, s, 2, 3);
	cout << "2: " << s2 << endl;

	//在s3的第四个元素位置插入一个常量字符串
	string s3("abcdef");
	s3.insert(3, "hello 66");
	cout << "3: " << s3 << endl;

	//在s4的第四个元素的位置"hello 66"的前5个元素
	string s4("abcdef");
	s4.insert(3, "hello 66", 5);
	cout << "4: " << s4 << endl;

	//在s5的第四个元素位置插入6个'q'
	string s5("abcdef");
	s5.insert(3, 6, 'q');
	cout << "5: " << s5 << endl;

	//在s6的首元素位置插入6个'q'
	string s6("abcdef");
	s6.insert(s6.begin(), 6, 'q');
	cout << "6: " << s6 << endl;

	//在s7的首元素位置插入'q'
	string s7("abcdef");
	s7.insert(s7.begin(), 'q');
	cout << "7: " << s7 << endl;

	//在s8的首元素位置插入s
	string s8("abcdef");
	s8.insert(s8.begin(), s.begin(), s.end());
	cout << "8: " << s8 << endl;

	return 0;
}

在这里插入图片描述

(但是在string对象字符序列中间插入元素时,会发生移动,所以效率不高,尽量少用)

不难发现,string的接口是有些冗余的,这里面的一些接口,并不是必须要使用的

append

append用于在string对象末尾追加一块内容

在这里插入图片描述
与上面类似,append也实现了许多的重载版本,例如在string对象末尾插入一个string对象(的部分)、插入一个C字符串(的前n个元素)、插入若干个指定字符、插入一个迭代器区间中的数据等等

int main()
{
	string s("ghijkl");

	//在s1后追加s
	string s1("abcdef ");//为观察清晰,在sn的末尾加上' '
	s1.append(s);
	cout << "1: " << s1 << endl;

	//在s2后追加s从第一个元素开始的3个元素
	string s2("abcdef ");
	s2.append(s, 0, 3);
	cout << "2: " << s2 << endl;

	//在s3后追加"hello 66"
	string s3("abcdef ");
	s3.append("hello 66");
	cout << "3: " << s3 << endl;

	//在s4后追加"hello 66"的前5个元素
	string s4("abcdef ");
	s4.append("hello 66", 5);
	cout << "4: " << s4 << endl;

	//在s5后追加6个'q'
	string s5("abcdef ");
	s5.append(6, 'q');
	cout << "5: " << s5 << endl;

	//在s6后使用反向迭代器追加倒置的s
	string s6("abcdef ");
	s6.append(s.rbegin(), s.rend());
	cout << "6: " << s6 << endl;
	return 0;
}

在这里插入图片描述

push_back

push_back即在string对象后尾插一个字符
在这里插入图片描述

int main()
{
	string s1("abcdef ");//为观察清晰,在s1的末尾加上' '
	//给s1尾插'q'
	s1.push_back('q');
	cout << "1: " << s1 << endl;
	return 0;
}

在这里插入图片描述

operator+=

operator+=+=的运算符重载,用于在string对象的末尾追加数据
在这里插入图片描述
使用+=,可以在string对象的末尾添加一个string对象、C字符串、一个字符:

int main()
{
	string s("ghijkl");
	//给s1+=s
	string s1("abcdef ");
	s1 += s;
	cout << "1: " << s1 << endl;

	//s2+="qqqqqq"
	string s2("abcdef ");
	s2 += "qqqqqq";
	cout << "2: " << s2 << endl;

	//s3+='q'
	string s3("abcdef ");
	s3 += 'q';
	cout << "3: " << s3 << endl;
	return 0;
}

在这里插入图片描述

pop_back

pop_back用于在string对象的尾删除一个字符

在这里插入图片描述

int main()
{
	//对s1尾删
	string s1("abcdef");
	cout << "0: " << s1 << endl;
	s1.pop_back();
	cout << "1: " << s1 << endl;
}

在这里插入图片描述

erase

erase用于删除string对象中的部分元素
在这里插入图片描述
erase有3个重载版本,可以实现删除string对象pos位置的len个元素(缺省值为npos)、迭代器位置的一个元素、迭代器区间中的元素:

int main()
{
	//删除s1中第四个元素位置的2个元素
	string s1("abcdef");
	s1.erase(3, 2);
	cout << "1: " << s1 << endl;

	//删除第二个元素
	string s2("abcdef");
	s2.erase(s2.begin() + 1);
	cout << "2: " << s2 << endl;

	//删除s3中第二个元素到倒数第二个元素
	string s3("abcdef");
	s3.erase(s3.begin() + 1, s3.end() - 1);
	cout << "3: " << s3 << endl;
	return 0;
}

在这里插入图片描述
但是删除string对象字符序列中间的元素时,会发生移动,所以效率不高,尽量少用

字符串查找

find

find用于在string对象中从指定位置向后查找子串

在这里插入图片描述
find有4个重载版本,其中参数pos为查找的起始位置。查找到则返回子串在原串中的位置,否则返回npos(-1u)
需要注意的是,当寻找子串时,必须与原串中完全匹配才会返回值。

借助find,可以实现将一个string对象依据某字符串分割(一个网址的分割):

int main()
{
	string web("https://legacy.cplusplus.com/reference/string/string/find/");
	size_t b1 = web.find("://");
	if (b1 != string::npos)
	{
		size_t b2 = web.find("/", b1 + 3);
		if (b2 != string::npos)
		{
			string protocol(web.begin(), web.begin() + b1);
			string domain(web.begin() + b1 + 3, web.begin() + b2);
			string uri(web.begin()+ b2 + 1, web.end());
			
			cout << protocol << endl;
			cout << domain << endl;
			cout << uri << endl;
		}
	}
}

在这里插入图片描述

rfind

find用于在string对象中从指定位置向前查找子串

在这里插入图片描述
rfindfind的区别只在于从 pos位置开始向前寻找,在这里就不再赘述了

非成员函数

operator>>

operator>>是流提取运算符重载,借助该运算符重载可以实现使用cin >> 方便的输入string对象
在这里插入图片描述

operator<<

operator<<是流插入运算符重载,借助该运算符重载可以实现使用cout << 方便的输入string对象
在这里插入图片描述

int main()
{
	string s;
	cin >> s;
	cout << s << endl;
	return 0;
}

在这里插入图片描述

总结

到此,关于string类主要接口的介绍及使用就介绍完了
熟练使用string会使我们在处理字符序列数据时更加方面

接下来的文章中将模拟实现string类的主要接口,欢迎大家持续关注

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

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

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

相关文章

光场成像2.0——聚焦型光场相机

光场2.0 1. 发展历程 由于光场1.0从结构上子图像的分辨率严重依赖MLA子透镜的数量&#xff0c;因此分辨率一直受限&#xff0c;限制了光场1.0结构的广泛应用。针对此不足&#xff0c;在2008年&#xff0c;又一篇伟大的论文出现了&#xff0c;该论文提出了全分辨率光场渲染的概…

CS拒绝连接,Cobalt Strike连接失败,Cobalt Strike使用方法(一)

拒绝连接 connection refused:connect。 kali端&#xff08;服务器端&#xff09;和本地端win10。看看端口开启状态 先启动服务器端 查看端口开启状态&#xff0c;确定50050端口开启&#xff0c;可以参阅本文章点击跳转 没问题再往下看。 使用步骤 chmod 777 ./teamserver…

【运维工程师学习】Centos中MySQL替换MariaDB

【运维工程师学习】Centos8中MySQL替换MariaDB 1、查看已有的mysql2、MySQL官网tar包下载3、找到下载路径解压4、移动解压后的文件夹到/usr/local/mysql5、创建data文件夹&#xff0c;一般用于存放数据库文件数据6、创建用户组7、更改用户文件夹权限8、生成my.cnf文件9、编辑my…

排序子序列,倒置字符串讲解(图文并茂)

目录 1.排序子序列 2.倒置字符串 1.排序子序列 排序子序列_牛客笔试题_牛客网 (nowcoder.com) 首先题干中提到非递增序列和非递减序列&#xff0c;那么我们就要先弄明白什么是上述2种序列&#xff1a; 非递增序列&#xff1a;a[i] > a[i1] 如&#xff1a;3 2 1 或者 3 3 …

运动控制-达妙C#开源USB2CAN例程

C# Can总线资料不多, 达妙USB2CAN入口 http://www.dmbot.cn/forum.php?modviewthread&tid328&extrapage%3D1

怎么自学网络安全?遇到问题该怎么解决?

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…

帝国cms如何判断首页高亮显示

通过简单的代码判断当前页面是否为首页并且进行高亮的代码如下&#xff1a; 判断逻辑是获取当前栏目id&#xff0c;如果为空则为首页。 条件判断代码&#xff1a; <?php if(empty($GLOBALS[navclassid])){echo class"active";}?> 需要特别说明的此判断会…

二进制文件的Python写入与读取

二进制文件的Python编写 这么基础的东西&#xff0c;必然用内置的就好 二进制文件的Python读写 重要提示 p.s. 1 >>> bHello World.decode() "Hello World" True >>> example import struct with open(binary_file.bin, wb) as file:data b…

【华为机试】HJ17 坐标移动详解+完整源代码示例

忙碌了一周&#xff0c;一直没时间更新&#xff0c;趁着周末来更新第二个题目。 题目 题目解析 这个题目相比于上一个题目来说&#xff0c;会简单一些&#xff0c;不涉及到那些复杂的算法&#xff0c;就是对于字符串的处理。 算法步骤 输入一个字符串根据分号&#xff0c;将…

uniapp 集成七牛云,上传图片

1 创建项目 我是可视化创建项目的 &#xff0c;cli创建的项目可以直接使用npm安装七牛云。 2 拷贝qiniuUploader.js到项目&#xff0c;下面的回复 放了qiniuUploader.js百度云链接。 3 在需要使用qiniuUploader的vue文件 引入。 4 相册选择照片&#xff0c;或者拍照后&#xff…

Redis-持久化、主从集群、哨兵模式、分片集群、分布式缓存

文章目录 高级篇 - 分布式缓存 Redis集群0、单节点Redis的问题一、Redis持久化1.1 RDB 持久化1.1.1 基本介绍1.1.2 RDB的fork原理1.2.3 总结 1.2 AOF持久化1.3 RDB与AOF对比 二、Redis主从集群2.1 介绍2.2 搭建主从集群2.2.1 准备实例、配置2.2.2 启动2.2.3 开启主从关系2.2.4 …

快速而简单的视频格式转换方法

在数字时代&#xff0c;我们经常需要将视频文件从一种格式转换为另一种格式。无论是因为兼容性问题&#xff0c;还是为了在特定设备上播放视频&#xff0c;视频格式转换是一项非常常见的任务。本文将介绍视频格式转换的基本知识和步骤。 首先&#xff0c;了解不同的视频格式非常…

8.3 非正弦波发生电路

在实用电路中除了常见的正弦波外&#xff0c;还有矩形波、三角波、锯齿波、尖顶波和阶梯波&#xff0c;如图8.3.1所示。 一、矩形波发生电路 矩形波发生电路是其它非正弦波发生电路的基础&#xff0c;例如&#xff0c;若方波电压加在积分运算电路的输入端&#xff0c;则输出就…

数学建模-相关系数

excel基本操作&#xff1a;ctrl右&#xff0c;ctrl左&#xff0c;ctrlshift下/右&#xff0c;ctrlshift空格 题目里有数据&#xff0c;给出描述性统计是比较好的习惯 excel描述性统计&#xff1a;数据-数据分析-描述统计 MATLAB要做散点图C62个 SPSS可以直接画出两两之间的散…

华为OD机试真题 Java 实现【最小循环子数组】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、备注五、Java算法源码六、效果展示1、输入2、输出 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有…

koa初体验———swagger使用

学习完koa框架和mysql&#xff0c;写了一个小demo&#xff0c;选课管理系统&#xff0c;其中包含权限验证&#xff0c;登录注册&#xff0c;用户管理和选课管理。写这个项目目的一方面是为了自己练手&#xff0c;另一方面是为了我们在学习新技术的时候能够有接口供我们使用去测…

Cilium基础架构

Cilium作为一款Kubernetes CNI插件&#xff0c;从一开始就是为大规模和高度动态的容器环境而设计&#xff0c;并且带来了API级别感知的网络安全管理功能&#xff0c;通过使用基于Linux内核特性的新技术——BPF&#xff0c;提供了基于service/pod/container作为标识&#xff0c;…

树莓派-家庭健康监测-空气篇

树莓派-家庭健康监测-空气篇 最后编辑日期: 2023.7.16 1、背景和目标 室内空气中高浓度的二氧化碳会损害人类的认知能力和健康&#xff0c;良好室内空气质量的重要性和价值不言而喻。家庭健康监测-空气篇应运而生。 最后效果总览: 细节: 手机预览: 实现功能: 二氧化碳…

Redis数据类型的常用命令和应用场景

1. Redis数据类型概述 Redis 常见的数据类型有10 种&#xff0c;其中包括 5 种基本数据类型&#xff1a;Strings(字符串)、Lists(列表)、Sets(集合)、Hashes(散列)、Sorted sets(Zset有序集合)。除了基本数据类型外&#xff0c;还有 5 种常用数据类型&#xff1a;Bitmaps 、Hy…

《二叉搜索树OJ》

文章目录 1、 [根据二叉树创建字符串](https://leetcode.cn/problems/construct-string-from-binary-tree/)2、 [二叉树的层序遍历](https://leetcode.cn/problems/binary-tree-level-order-traversal/)3、 [二叉树的层序遍历 II](https://leetcode.cn/problems/binary-tree-le…