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

C++ --- string

C++ --- string

  • 简介
  • 1、构造函数
  • 2、迭代器(主流的遍历方式)
    • 2.1字符串经典遍历和修改的方式
    • 2.2使用迭代器遍历和修改字符串
    • 2.3使用范围for遍历对象(C++11支持的新特性)
  • 3、常见,常用方法或重载
    • 3.1查询大小和容量管理
    • 3.2增
    • 3.3删
    • 3.4改
    • 3.5查
    • 3.5其他

简介

在C++中,std::string 是标准模板库(STL)提供的字符串类,用于表示和操作字符序列。它是C风格字符串(char*char[])的现代化替代品,具有更安全、更便捷的特性。
不过string类面世比STL早,当中很多定义的功能对比真正的STL中提供的其他类来说即繁杂又重复,不过其思想是符合STL的。

STL的六大组件:
在这里插入图片描述

学前必知:
通过string类生成的对象的成员变量有三个,一个是指向底层数组的指针,一个siz字符串的大小,一个capacity字符串的容量。
数组内存储的字符串和C语言是一样的,末尾都会有一个\0的存在。

1、构造函数

(1)默认构造

	//默认的:(1)	string();string s1;                //创建一个空字符s1,后续可以手动初始化s1 = "abcdefg";string s2 = "abcdefg";    //上述两步合并 

之所以能写成赋值的这种形式,是因为string类重载了赋值符号即operator = ,所以才会出现赋值形式的构造。

(2)拷贝构造

	//拷贝:(2)	string(const string & str);string s4("abc");string s5(s4);//string s5 = s4;         //此写法也可

(3)部分拷贝 — 截取字符串

	//截取字符串:(3)	string(const string & str, size_t pos, size_t len = npos);//pos --- 截取的起始位置//npos --- 截取的长度string s6(s1, 1, 5);      //输出bcdef//string s6(s1, -1, 5);     //程序直接崩溃string s7(s1, 1, 10);     //输出bcdefg

监视窗口观察:
在这里插入图片描述

1)当截取的起始位置不是一个正确的值时,此时运行程序,程序会直接崩溃。
2)当截取的长度大于字符串本身的长度时,默认输出从截取位置之后的整个字符串,并不会报错。

(4)拷贝来自C语言方式的字符串(字符数组)

	//拷贝来自C语言方式的字符串:(4)	string(const char* s);char ch2[5] = "abc";string s8(ch2);           //这里ch2就已经是地址了cout << s8 << endl;string s3("abcdefg");     //这样才是常写的形式

(5)部分拷贝来自C语言方式的字符串(字符数组)

	//部分拷贝来自C语言方式的字符串:(5)	string (const char* s, size_t n);char ch3[10] = "abcdefgh";string s9(ch3,5);cout << s9 << endl;

监视窗口观察:
在这里插入图片描述

(6)使用n个c字符填充整个字符串

	//使字符串充满n个C字符:(6)	string (size_t n, char c);string s10(10, 'n');

监视窗口观察:
在这里插入图片描述

上述构造方法中(1),(2),(4)用得较多,其他几个用得少。

2、迭代器(主流的遍历方式)

迭代器是STL中一个新的概念,虽说概念较新,但是其功能就是遍历对象中的元素。
STL中的容器都有自己的迭代器,但是基础使用上都差不多,所以知识可迁移性很强。
这里只介绍它的使用,不介绍其底层机理。

迭代器是嵌套在string类中的类类型,使用方式就是容器名称 : : iterator 迭代器名称 = 对象.begin()或者对象.end(),string类中就是string : : iterator 迭代器名称 = 对象.begin()或者对象.end(),迭代器名称可以随便取,但是通常方便记忆就取了it,iterator的前两个字母。
想要获取迭代器指向的内容,语法就和指针相似,解引用迭代器名称即可。

上面说到迭代器的功能是遍历对象中的元素,回到string类这里,我们之前就已经学习过一种遍历字符串的方式,一个for循环使用[ ]加下标来遍历。

2.1字符串经典遍历和修改的方式

示例代码如下:

	//string类的经典遍历方式:[ ]加下标string s2("hello world");for (int i = 0; i < s2.size(); i++){cout << ++s2[i] << " ";}cout<<endl;

运行结果:
在这里插入图片描述
为什么s2对象能使用数组的形式使用[ ]来确定元素?
是因为string类中将[ ]给重载了:
在这里插入图片描述
传递一个pos位置,其返回此位置上的元素值的引用。
s2.size(),是string类中定义的之中确定字符串长度的方法,在此类中还有一个length(),也是确定字符串长度的方法(此方法用的少)。

2.2使用迭代器遍历和修改字符串

示例代码如下:

	//2、迭代器//获取正向迭代器//begin() --- 获取起始位置的迭代器//end() --- 获取最后一个位置的下一个位置的迭代器//其区间是左闭右开区间string s1("hello world");string::iterator it1 = s1.begin();string::iterator it2 = s1.end();//for形式for (it1 = s1.begin(); it1 != it2; ++it1) {//++(*it1);cout << *it1 << " ";       //打印其指向的内容,形式上就是指针的模样}cout << endl;//while形式while (it1 != it2){cout << *it1 << " ";++it1;}cout << endl;

运行结果如下:
在这里插入图片描述
这里的begin是返回对象首元素位置的迭代器,end是返回首元素最后一个元素的下一个位置的迭代器,其区间表示为:[begin,end),是一个左闭右开区间,在C/C++语言内凡是存在区间的基本上都是左闭右开区间。

既然有正向迭代器也就有反向迭代器:

	//获取反向迭代器//rbegin() --- 获取最后一个位置的迭代器//rend() --- 获取起始位置的前一个位置的迭代器//其区间是左开右闭区间string s2("hello world");string::reverse_iterator r_it1 = s2.rbegin(); string::reverse_iterator r_it2 = s2.rend();for (r_it1; r_it1 != r_it2; r_it1++){cout << *r_it1;}cout << endl;

运行结果:
在这里插入图片描述
这里的rbegin是获取最后一个位置的迭代器,rned是获取起始位置的前一个位置的迭代器,对其++是从最后一个元素位置向前遍历,和正向迭代器是相反的操作。

也有对于const修饰的对象的常量迭代器:

	//获取常量迭代器//cbegin() --- 获取起始位置的迭代器//cend() --- 获取最后一个位置的下一个位置的迭代器//区间同样是左闭右开区间const string s3("hello world");string::const_iterator c_it1 = s3.cbegin();string::const_iterator c_it2 = s3.cend();for (c_it1; c_it1 != c_it2; c_it1++){cout << *c_it1;}cout << endl;

常量反向迭代器:

	//获取常量反向迭代器const string s4("hello world");string::const_reverse_iterator c_r_it1 = s3.crbegin();string::const_reverse_iterator c_r_it2 = s3.crend();

上述迭代器的用法只是众多迭代器使用方式的一种,之后其他的使用方式在后面的容器里再学习。

2.3使用范围for遍历对象(C++11支持的新特性)

在讲解范围for之前要先了解auto,这是一个自动识别类型的关键字。
示例代码如下:

	// auto关键字 --- 自动识别类型auto x = 10;    // 这里auto就识别成int类型auto y = 3.14;  // 这里auto就识别成double类型int& m = x;// auto z = m;   // 这里的z是对于引用m的值的赋值,不是m的引用auto& z = m;     // 正确写法m++;             // 是引用则z,m ,x都会改变// 指针 --- 下面两种写法都可以auto px1 = &x;   //灵活性更高,当 & 删除时,则识别为int类型auto* px2 = &x;  //较为固定,只能识别指针类型

调试窗口观察:
在这里插入图片描述

范围for示例代码:

	// 范围for --- 支持各种STL容器// 语法auto 对象名 :需要遍历的对象名 // 其底层就是迭代器// 是将 *迭代器对象拷贝给auto对象// 并且自动判断(!=),自动迭代(++)string s4("hello world");//这种写法是只能遍历//当然也能直接指定类型://for(char e : s4)for (auto e : s4){cout << e << " ";}cout << endl;//这种写法才能修改for (auto& e : s4){cout << ++e << " ";}cout << endl;//特殊用法,数组也能使用范围for遍历char arr[10] = "abcdefghi";for (auto e : arr){cout << e << " ";}cout << endl;

总结:对于string类,for循环加 [ ] 加下标遍历方式更加常用,不过对于其他STL容器,迭代器是更加主流的遍历方式,不过上述三种的遍历方式都是灵活的去使用,并不是死板的。

3、常见,常用方法或重载

3.1查询大小和容量管理

(1)size(),length()
功能:size()和length()都是string类查询对象大小的方法,不过更多使用的是size(),因为length()先出现,而为了规范性,和其他容器的查询大小方法一致,后续就添加了size()。

示例代码如下:

	// 1.查询对象大小// size() , length() ,功能上相同string s1("hello world!!");// 结果一致 --- 13cout << s1.size() << endl;cout << s1.length() << endl;

常用于for循环的结束条件。

(2)capacity()
功能:capacity()是一个查看对象容量大小的一个接口。

示例代码如下:

	//(2)capacity()// 查询对象的容量string s2("hello world");string s3;cout << s2.capacity();                 //起始是15cout << s3.capacity() << endl;         //即使是空对象,capacity也是初始为15// 查看扩容机制 --- 几倍扩容 --- 除了第一次为两倍,后续均为1.5倍扩容string s4;size_t cy = s4.capacity();cout << cy << endl;for (int i = 0; i < 100; i++){s4.push_back('L');if (s4.capacity() != cy){cy = s4.capacity();cout << cy << endl;}}

查看扩容机制的运行结果:
在这里插入图片描述
15到31,两倍左右;31到47,约1.5倍;47到70,约1.5倍;后续一样。

(3)reserve()
功能:将字符串容量调整为计划的大小,长度最多为n个字符

示例代码如下:

	// 请求将字符串容量调整为计划的大小,长度最多为n个字符。string s5("hello world");          //capacity = 15// 用法一:扩容(最常用的)s5.reserve(100);cout << s5.capacity() << endl;     //capacity = 111// 用法二:缩容 --- 这是一个不具约束力的请求,也就是说可能会缩容,或者不缩容s5.reserve(30);                 cout << s5.capacity() << endl;     //capacity = 111// 此接口的n值不会影响字符串的长度s5.reserve(3);cout << s5.capacity() << endl;     //capacity = 111

最常用的用法是提前给定容量大小,减少反复扩容的操作,提高效率,本质上是一个空间换时间的操作。

优化上述capacity中扩容机制的代码:

	string s4;s4.reserve(100);           //这样一来直接开到111容量,可以减少后续的扩容操作size_t cy = s4.capacity();cout << cy << endl;for (int i = 0; i < 100; i++){s4.push_back('L');if (s4.capacity() != cy){cy = s4.capacity();cout << cy << endl;}}

(4)shrink_to_fit()
功能:这是一个纯粹的缩容接口,将对象的capacity缩容到size大小缩容在string类里面是一个不具有约束里的请求。

示例代码如下:

	// 这是一个纯粹的缩容接口string s6;s6.reserve(100);cout << "缩容之前:" << s6.capacity() << endl;      s6.shrink_to_fit();cout << "缩容之后:" << s6.capacity() << endl;

运行结果:
在这里插入图片描述

缩容机制(图解):
在这里插入图片描述
基于上述机制,缩容的代价是很大的,要少用此接口,故缩容操作是一个不具约束力的请求。

(5)resize()
功能:更改size或者capacity的大小

示例代码如下:

	// void resize(size_t n);               //此重载改变size大小,若大于size或者capacity,则字符串后续会被填充进空字符(\0)// void resize(size_t n, char c);       //此重载改变size大小,若大于size或者capacity,则字符串后续会被填充进给定的c字符// 1、当 n > capacity(大于容量了故也大于size) --- 将size设定到目标大小并且进行扩容操作string s7("hello world");cout << "resize之前的size:" << s7.size() << endl;            // 11cout << "resize之前的capacity:" << s7.capacity() << endl;    // 15s7.resize(30,'x');s7.resize(30);              //此写法就是将x替换成了\0,这一个看不见的字符cout << s7 << endl;cout << "resize之后的size:" << s7.size() << endl;            // 30cout << "resize之后的capacity:" << s7.capacity() << endl;    // 31// 2、当 capacity > n > size  --- 和一一样的功能// 3、当 n < size  --- 只保留给定的n个字符,多的字符全部删除string s8("hello world");cout << "resize之前的size:" << s8.size() << endl;            // 11cout << "resize之前的capacity:" << s8.capacity() << endl;    // 15s8.resize(5);cout << s8 << endl;          //hellocout << "resize之后的size:" << s8.size() << endl;            // 5cout << "resize之后的capacity:" << s8.capacity() << endl;    // 15

运行结果:
在这里插入图片描述

3.2增

(1)operator += - - - 用得最多的
功能:可以添加字符串,字符或者string类的对象。

示例代码如下:

	// 2.增// 增加一个string类对象(1):    string& operator+= (const string & str);// 增加一个字符串(2):          string& operator+= (const char* s);// 增加一个字符(3):            string& operator+= (char c);string s2;string s3("2025/5/19 ");s2 += s3;                 //(1)的用法s2 += "hello";            //(2)的用法s2 += "_";                //(2)的用法s2 += '\n';               //(3)的用法s2 += "world";            //(2)的用法cout << s2 << endl;

运行结果:
在这里插入图片描述

(2)operator +
功能:连接两个string类对象,并返回一个新串

示例代码如下:

	// 连接两个string类对象,并返回一个新串string s5("aaa");string s6("bbb");cout << "s5 + s6:" << s5 + s6 << endl;

运行结果:
在这里插入图片描述

(3)push_back()
功能:可以将单个字符添加到字符串末尾

示例代码如下:

	//(2)push_back()// 将单个字符添加到字符串末尾string s4("hello");s4.push_back(' ');s4.push_back('w');s4.push_back('o');s4.push_back('r');s4.push_back('l');s4.push_back('d');cout << s4 << endl;

运行结果:
在这里插入图片描述

(4)insert()
功能:在指定位置插入字符或者字符串

示例代码如下:

	// 任意位置插入元素// 插入一个string对象(1):        string& insert(size_t pos, const string & str);// 插入一个子串(2):              string& insert(size_t pos, const string & str, size_t subpos, size_t sublen);// 插入一个C风格的字符串(3):     string & insert(size_t pos, const char* s);// 插入一个字符串的前n个字符(4): string& insert(size_t pos, const char* s, size_t n);// 插入n个c字符(5):              string& insert(size_t pos, size_t n, char c);string s7("abgh");string s8("1234");cout << s7.insert(2, s8) << endl;            // (1) --- ab1234ghcout << s7.insert(2, s8, 2, 4) << endl;      // (2) --- ab34ghcout << s7.insert(2, "cdef") << endl;        // (3) --- abcdefghcout << s7.insert(2, "xyz", 2) << endl;      // (4) --- abxyghcout << s7.insert(2, 5, 'x') << endl;        // (5) --- abxxxxxgh

总结:
insert最常用的重载是(1),(3),(5),并且要谨慎使用(不是不安全),而是insert底层涉及数据挪动。

(5)append - - - 用的少这里只介绍最实用的几个重载
功能:可以将字符或者字符串添加到字符串末尾

示例代码如下:

	// 可以将字符或者字符串添加到字符串末尾//插入一个string对象(1):      string& append(const string & str);//插入一个字符串(2):          string & append(const char* s);//插入n个字符(3):             string& append(size_t n, char c);string s9;string s10("hello");s9.append(s10);             // (1) --- hellos9.append(" world");        // (2) --- hello worlds9.append(3, '!');          // (3) --- hello world!!!

3.3删

(1)erase()
功能:删除指定位置之后的n个字符,也需谨慎使用,底层同样涉及数据挪动,效率低下。

示例代码如下:

	// 删除指定位置之后的n个字符string s1("aaabbbcccddd");s1.erase(3, 6);     // aaaddd// 也可以不指定第二个参数len ,这样就是使用的缺省值npos,而npos是无符号整数的最大值,用了-1表示// 这样的用法就相当于自第三个位置之后所有的数据全部都删除s1.erase(3);        // aaa

(2)pop_back()
功能:删除字符串末尾的一个字符

示例代码如下:

	// 删除字符串末尾的一个字符string s2("abcde?");s2.pop_back();              // abcdes2.pop_back();              // abcds2.pop_back();              // abc

(3)clear()
功能:清空整个字符串

示例代码如下:

	// 清空整个字符串string s3("hello shsh>>?");s3.clear();                 // 变为空值: ""

3.4改

replace()
功能:修改从pos位置开始,长度为n的字符或者字符串,它的效率也是很低的,谨慎使用,原因基本一致(erase和insert)

示例代码如下:

	// 4.改 --- 或者替换// (1)replace// 从pos位置开始,插入n个长度的string类对象(1):    string& replace(size_t pos, size_t len, const string & str);// string类对象的部分(2):    string& replace(size_t pos, size_t len, const string & str,size_t subpos, size_t sublen);// subpos --- pos位置开始// sublen --- 修改的长度// C语言风格字符串(3):    string & replace(size_t pos, size_t len, const char* s);// C语言风格字符串的一部分(4):    string& replace(size_t pos, size_t len, const char* s, size_t n);// 使用n个字符替换指定目标字符(串)(5):    string& replace(size_t pos, size_t len, size_t n, char c);string s1("aaabbbccceee");string s2("ddd");cout << s1.replace(9, 3, s2) << endl;          //(1) --- aaabbbcccdddcout << s1.replace(9, 3, s2, 0, 2) << endl;    //(2) --- aaabbbcccddcout << s1.replace(9, 3, "eee") << endl;       //(3) --- aaabbbccceeecout << s1.replace(9, 3, "eee", 1) << endl;    //(4) --- aaabbbcccecout << s1.replace(9, 3, 3, 'n') << endl;      //(5) --- aaabbbcccnnn

其中常用的为(3)

3.5查

(1)empty
功能:检查字符串是否为空,若为空,则返回0(false),反之返回1(true)

示例代码如下:

	//(1)empty()// 查看(判断)字符串是否为空,若不为空则返回0(false),反之返回1(true)string s4("hello shsh>>?");bool b1 = s4.empty();s4.clear();bool b2 = s4.empty();cout << b1 << endl;          //0cout << b2 << endl;          //1

(2)operator[ ]
功能:返回第pos位置上的元素,并且该重载会检查数组越界,若出现数组越界操作,则会直接程序崩溃。

示例代码如下:

	//(2)operator[] // 返回第pos位置的数据string s2("hello world!!");cout << s2[0] << endl;       //hcout << s2[0]++ << endl;     //i --- 也可以进行修改操作cout << s2[7] << endl;       //ocout << s2[12] << endl;      //!cout << s2 << endl;          //iello world!!// 该重载会检查数组越界 --- 直接会发生程序崩溃//s2[14];// 普通数组不会程序崩溃,因为对于C/C++编译器来说检查普通数组的越界操作是一个影响效率的操作int arr[10] = { 0 };arr[20];

(3)at()
功能:功能和operator[ ]一样,不过处理错误时是抛异常,而非检查返回值

示例代码如下:

	//(3)at()// 功能和operator[ ]一样,不过处理错误时是抛异常,而非检查返回值string s3("123456");s3.at(0)++;cout << s3 << endl;         //23456cout << s3.at(5) << endl;   //6try{//at接口的越界操作cout << s3.at(10) << endl;  //抛异常}catch(exception& e){cout << e.what();}

运行结果:
在这里插入图片描述
invalid string position此异常即为字符串位置无效。

(4)front()与back()
功能:返回字符串的起始位置、末尾位置的元素,这两操作都不能对空对象进行操作,会直接导致程序崩溃

示例代码如下:

	//(4)front()// 返回字符串的起始字符,若对于空对象进行此操作会导致程序崩溃string s4("12345");cout << s4.front() << endl;         //1//s4.clear();        //对于空对象进行此操作会导致程序崩溃//cout << s4.front();//(5)back()// 返回字符串的末尾字符,同理进行对空对象的操作会导致程序崩溃string s5("12345");cout << s5.back() << endl;          //5//s5.clear();        //不能对空对象进行此操作//cout << s5.back();

(5)find()和rfind()
功能:find()是查询指定的字符返回其下标、或者查询字符串返回起始位置的下标。rfind()是反向查询字符或者字符串,并返回其下标。

示例代码如下:

	// 查询字符串:	size_t find(const char* s, size_t pos = 0) const;// 查询字符: 	size_t find(char c, size_t pos = 0) const;// 第二个参数pos就是从串的哪一个位置开始查询,没有指定则使用缺省值0,即从头开始查询// 若没有找到指定的字符或者字符串,则返回重载的全局静态成员常量npos,这是一个非常大的数// 返回指定字符或者字符串(起始位置)的下标string s6("hello world!!");size_t pos1 = s6.find('h');         // 这里返回 h 的下标:0size_t pos2 = s6.find("!!");        // 这里返回第一个!号的下标:11size_t pos3 = s6.find('h',1);       // 这里返回npos,即非常大的数cout << pos1 << endl;cout << pos2 << endl;cout << pos3 << endl;

运行结果:
在这里插入图片描述

(6)substr()
功能:提取子串,从pos位置开始,提取len个字符,其区间是 [ ) 式。

示例代码如下:

	// string substr (size_t pos = 0, size_t len = npos) const;// pos --- 指定从哪个位置开始查找,若不指定则使用缺省值0,即从头开始查找// len --- 指定的提取子串的长度,若不指定则使用缺省值npos,即提取直到字符串末尾// 返回值是一个string类型// 若给定的 pos 非法(pos > size()),则会抛出异常 --- 超出范围异常// // 查询子串string s7("123abc!!");string str1 = s7.substr();           // 都不指定则提取整个字符串string str2 = s7.substr(3);          // --- abc!!string str3 = s7.substr(0, 3);       // --- 123string str4 = s7.substr(6, 2);       // --- !!cout << "str1 = " << str1 << endl;cout << "str2 = " << str2 << endl;cout << "str3 = " << str3 << endl;cout << "str4 = " << str4 << endl;try{string str5 = s7.substr(10);     //这里 pos > s7.size()}catch(const exception& e){cout << e.what() << endl;}

运行结果:
在这里插入图片描述

3.5其他

(1)c_str()和data()
功能:返回底层指向的数组的指针

示例代码如下:

	// 返回底层指向数组的指针// 返回值都是const char*string s1("hello world");const char* pstr1 = s1.c_str();const char* pstr2 = s1.data();

在某些使用C语言的函数的情况下会使用。

(2)重载全局的各种关系运算符
==、!=、<、<=、>、>=
在这里插入图片描述
其比较方式和C语言的strcmp函数相同,依次比较对应位置上的字符的ASCII值
返回值均是bool类型

相关文章:

C++ --- string

C --- string 简介1、构造函数2、迭代器&#xff08;主流的遍历方式&#xff09;2.1字符串经典遍历和修改的方式2.2使用迭代器遍历和修改字符串2.3使用范围for遍历对象&#xff08;C11支持的新特性&#xff09; 3、常见&#xff0c;常用方法或重载3.1查询大小和容量管理3.2增3.…...

Android Studio 连接夜神模拟器 自动断开的问题

版本情况&#xff1a; Android Studio Meerkat Feature Drop | 2024.3.2 Build #AI-243.25659.59.2432.13423653, built on April 30, 2025 Runtime version: 21.0.6-13368085-b895.109 amd64夜神模拟器 V7.0.5.9046 问题描述&#xff1a; cmd命令行使用adb连接夜神模拟器成…...

Python入门手册:Python中的数据结构类型

在Python中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;它们允许你以高效的方式操作和处理数据。Python提供了几种内置的数据结构&#xff0c;包括列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&a…...

《P3435 [POI 2006] OKR-Periods of Words》

题目描述 一个字符串是由有限个小写英文字母组成的序列。特别地&#xff0c;它可以是一个空序列&#xff0c;即由 0 个字母组成的序列。我们用 ABC 表示字符串 A 是通过连接字符串 B 和 C&#xff08;按此顺序&#xff09;得到的&#xff08;即一个接一个地写在一起&#xff0…...

C/C++---隐式显式转换

1. 隐式转换&#xff08;Implicit Conversion&#xff09; 隐式转换是编译器主动进行的类型转换&#xff0c;无需程序员额外编写代码。这种转换一般发生在赋值、函数调用、表达式计算等场景中。 1.1 隐式转换的常见场景 数值类型转换&#xff1a;从较小的类型转换为较大的类…...

巡礼中国西极·跨越昆仑天山 | 北斗卫星徽章护航昆仑科考

神秘深邃&#xff0c;遗世独立。帕米尔高原&#xff0c;横亘于中亚东南部&#xff0c;我国的最西端&#xff0c;面积约10万平方千米&#xff0c;平均海拔4500米以上&#xff0c;古代丝绸之路在此经过。昆盖山&#xff0c;一座掩藏在帕米尔高原褶皱深处、鲜为人知的山脉&#xf…...

Vue常用自定义指令-积累的魅力【VUE】

前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中&#xff0c;整理了自定义指令部分vue2和vue3 两个版本的区别&#xff0c;有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码&#xff0c;与大家一起分享。…...

LangChain4j第三篇: RAG的简单应用与实践

引言:RAG 构建属于你的大模型 大语言模型(LLM)的知识体系本质上仅限于它所接受的训练数据。 其一在知识时效性方面,模型参数固化于训练完成的时点,而现实世界中的知识和信息持续动态更新。 其二在非公开数据层面,企业内部的机密文档(如产品设计图、商业策略等)及个人隐…...

机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴

机器学习第二十六讲&#xff1a;官方示例 → 跟着菜谱学做经典菜肴 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 以跟着菜谱学…...

功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法

howler.js 是一个功能强大且易于使用的 JavaScript 音频库&#xff0c;它提供了跨浏览器的音频播放功能&#xff0c;支持多种音频格式&#xff0c;并且具有丰富的 API&#xff0c;可以方便地控制音频的播放、暂停、循环、音量等。下面是如何在 Vue 项目中使用 howler.js 实现音…...

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…...

如何使用patch-package给npm包打补丁

一、背景 在移动应用开发中,轮播是一种很常见的效果,我们项目采用的是RN跨平台技术,RN的轮播我们直接使用的是第三方插件:react-native-snap-carousel。不过,当我们在项目中使用的时候却发现Android和iOS的表现不一致:https://stackoverflow.com/questions/60711611/rea…...

maxkey单点登录系统

github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方镜像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 参考地址&#xff1a; Docker部署 | MaxKey单点登录认证系统 拉取docker脚本MaxKey: Dromara &#x1f5dd;️MaxK…...

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内 前言&#xff1a;最近遇到一个需求&#xff0c;我有15个文件夹(可能包含子文件夹) &#xff0c;目前我有一批文件名称&#xff0c;需要在这15个文件夹中查找出来&#xff0c;并拷贝到一个新的文件夹…...

Notepad++ 下载与安装教程(小白专属)

文章目录 Notepad下载渠道的专业选择1. 官方网站下载&#xff08;海外用户或网络条件优越者首选&#xff09;2. 国内优化下载地址&#xff08;国内用户高效选择&#xff09; Notepad精细化安装流程解析总结与后续建议 在当前的开发与文本处理工作中&#xff0c;Notepad无疑是一…...

Spring Cloud Gateway 微服务网关实战指南

上篇文章简单介绍了SpringCloud系列OpenFeign的基本用法以及Demo搭建&#xff08;Spring Cloud实战&#xff1a;OpenFeign远程调用与服务治理-CSDN博客&#xff09;&#xff0c;今天继续讲解下SpringCloud Gateway实战指南&#xff01;在分享之前继续回顾下本次SpringCloud的专…...

微服务架构实战:Eureka服务注册发现与Ribbon负载均衡详解

微服务架构实战&#xff1a;Eureka服务注册发现与Ribbon负载均衡详解 一 . 服务调用出现的问题二 . EureKa 的作用三 . 服务注册3.1 搭建 EureKaServer① 创建项目 , 引入 spring-cloud-starter-netflix-eureka-server 的依赖② 编写启动类 , 添加 EnableEurekaServer 注解③ 添…...

采用多维计算策略(分子动力学模拟+机器学习),显著提升 α-半乳糖苷酶热稳定性

字数 978&#xff0c;阅读大约需 5 分钟 在工业应用领域&#xff0c;α-半乳糖苷酶在食品加工、动物营养及医疗等方面发挥着重要作用。然而&#xff0c;微生物来源的该酶往往存在热稳定性不足的问题&#xff0c;限制了其在工业场景中的高效应用。近日&#xff0c;来自江南大学的…...

【java】小练习--零钱通

文章目录 前言一、项目开发流程说明二、功能实现2.1 菜单2.2 零钱通明细2.3 零钱通收益2.4 零钱通消费2.5 零钱通退出确认2.6 零钱通金额校验2.7 完整代码 三、零钱通OOP版 前言 本文是我跟着B站韩顺平老师的 Java 教程学习时动手实现“零钱通”项目的学习笔记&#xff0c;主要…...

旅游信息检索

旅游信息检索 旅游信息检索是系统中实现数据获取和处理的关键环节&#xff0c;负责根据用户输入的目的地城市和出游天数&#xff0c;动态获取并生成高质量的旅游数据。 模块的工作流程分为以下几个阶段&#xff1a;首先&#xff0c;对用户输入的信息进行标准化处理&#xff0…...

贝叶斯理论

一、贝叶斯理论的核心思想 贝叶斯理论&#xff08;Bayesian Theory&#xff09;是一种基于条件概率的统计推断方法&#xff0c;其核心是通过先验知识和新观测数据的结合&#xff0c;动态更新对事件发生概率的估计。它体现了“用数据修正信念”的思想&#xff0c;广泛应用于机器…...

Docker-mongodb

拉取 MongoDB 镜像: docker pull mongo 创建容器并设置用户&#xff1a; 要挂载本地数据目录&#xff0c;请替换此路径: /Users/Allen/Env/AllenDocker/mongodb/data/db docker run -d --name local-mongodb \-e MONGO_INITDB_ROOT_USERNAMEadmin \-e MONGO_INITDB_ROOT_PA…...

Gartner《Optimize GenAI Strategy for 4 Key ConsumerMindsets》学习心得

一、引言 在当今数字化营销浪潮中,生成式人工智能(GenAI)正以前所未有的速度重塑着市场格局。GenAI 既是一场充满机遇的变革,也是一场潜在风险的挑战。一方面,绝大多数 B2C 营销领导者对 GenAI 赋能营销抱有极高期待,他们看到了 GenAI 在提升时间与成本效率方面的巨大潜…...

[ARM][汇编] 02.ARM 汇编常用简单指令

目录 1.数据传输指令 MRS - Move from Status Register 指令用途 指令语法 代码示例 读取 CPSR 到通用寄存器 在异常处理程序中读取 SPSR 使用场景 MSR - Move to Status Register 指令语法 使用场景 示例代码 改变处理器模式为管理模式 设置条件标志位 异常处理…...

达梦数据库-学习-22-库级物理备份恢复(超详细版)

目录 一、环境信息 二、说点什么 三、概念 1、备份恢复 2、重做日志 3、归档日志 4、LSN 5、检查点 四、语法 1、BACKUP DATABASE 2、DMRMAN RESTORE DATABASE 3、DMRMAN RECOVER DATABASE 4、DMRMAN UPDATE DB_MAGIC 五、实验 1、开归档 &#xff08;1&#xf…...

python网络爬虫的基本使用

各位帅哥美女点点关注&#xff0c;有关注才有动力啊 网络爬虫 引言 我们平时都说Python爬虫&#xff0c;其实这里可能有个误解&#xff0c;爬虫并不是Python独有的&#xff0c;可以做爬虫的语言有很多例如&#xff1a;PHP、JAVA、C#、C、Python。 为什么Python的爬虫技术会…...

AI Agent开发第74课-解构AI伪需求的魔幻现实主义

开篇 🚀在之前的系列中我们狂炫了AI Agent的各种高端操作(向量数据库联动、多模态感知、动态工作流等…),仿佛每个程序员都能用LLM魔法点石成金✨。 但今天咱们要泼一盆透心凉的冷水——当企业把AI当成万能胶水强行粘合所有需求时,连电风扇都能被玩出量子纠缠的魔幻现实…...

【卫星通信】通信卫星链路预算计算及其在3GPP NTN中的应用

引言 卫星通信是现代信息传播的重要手段&#xff0c;广泛应用于电信、广播、气象监测、导航等领域。卫星链路预算计算是设计和优化卫星通信系统的重要步骤&#xff0c;它帮助工程师评估信号在传输过程中的衰减和增益&#xff0c;从而确保系统在预定条件下可靠地工作。 1. 链路…...

HTTP请求方法:GET与POST的使用场景解析

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 HTTP协议定义了多种请求方法&#xff0c;其中GET和POST是最常用的两种。它们在Web开发中承担着不同的角色&#xff0c;理解其核心差异和使用场景是构建高效、…...

第十五章:数据治理之数据目录:摸清家底,建立三大数据目录

在上一篇随想篇中&#xff0c;介绍了数据资源资产化的过程&#xff0c;理解了数据资源、数据资产的区别。这些对于本章的介绍会有帮助&#xff0c;如果仍有疑问可以看上一篇【数据资源到数据资产的华丽转身 ——从“沉睡的石油”到“流动的黄金”】。 说到本章要介绍的数据目录…...