C++--string类对象
一,引言
string类对象在于更好的处理字符串问题,为对于字符串这一类型提供更加方便的接口和运算符的重载。本片文章首先会引入auto关键字和范围for两个C++11小语法。之后按照如下网站所提供的顺序经行讲解。cplusplus.com - The C++ Resources Networkhttps://legacy.cplusplus.com/
一共分为八个部分,默认成员函数,迭代器, 关于容量的成员函数,元素存取相关函数,修饰符相关函数,针对字符串的操作的函数,全局函数。本篇文章对经常使用的进行详细的介绍,其他的进行略讲,有需求的通过上面的网站有详细的介绍。
二,auto关键字,范围for
1,auto关键字
auto首先不能作用于数值,其次auto不能作为函数的形参的参数类型,当auto同时修饰多个变量时,变量的类型必须一致。否则会导致编译报错。通常来说auto就是通过编译器的推理来确定auto修饰的数据类型。下面提供一些例子:
void text1()
{int a = 0;auto b = a;
}auto fun3()
{return 3;
}int main()
{auto b = fun3();return 0;
}
auto b根据a的类型编译器推到得出b的类型,auto作为函数返回类型是同样根据返回值得出auto具体的返回类型,当使用auto变量去接受函数体是也是根据返回数据的数据类型进而得出auto的具体类型。
以上例子看似得不出来auto得优越性,下面还有一组例子:
int main()
{string s1 = "fadslfj";std::string::iterator it = s1.begin();auto s = it;return 0;
}
当数据得类型特别长时,使用auto会大大的减少变量类型的书写长度,使得代码更加简洁。
2,范围for
范围for分为两个部分,第一部分表示范围内使用迭代器,第二部分表示迭代的范围。
范围for具有自动迭代,自动取数据,自动判读结束的性质。其作用范围可用于数组以及容器对象进行迭代。
下面举一些例子:
int main()
{int array[] = { 1, 2, 3, 4, 5 };// C++98的遍历for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){array[i] *= 2;}for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){cout << array[i] << endl;}// C++11的遍历for (auto& e : array)e *= 2;for (auto e : array)cout << e << " " << endl;string str("hello world");for (auto ch : str){cout << ch << " ";}cout << endl;return 0;
}
头两个是数组普通的数据进行遍历,后面auto表示一个迭代器变量,冒号后面表示迭代器的范围,当使用引用时必须加&。当作用在类对象时也是一样的。
三,默认成员函数
1,构造函数
首先第一个支持无参数的默认构造,第二个,以及第三个为拷贝构造。第四个,第五个支持字符串形式的构造。第六个支持字符形式的构造。
下面举一些例子来看一下效果:
void text_string1()
{//传入字符串形式string s1("fsdlkjlsdfjk");//字符串,加个数string s2("asdf", 2);//个数,单个字符string s3(2, 'a');//拷贝构造string s4(s3);//拷贝构造,后加参数的string s5(s1, 1, 3);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cout << s5 << endl;
}
第二个就是单纯的拷贝构造--------------s4
第三个表示从原对象的第pos个位置开始拷贝,拷贝长度为npos的字符到原对象--------s5
第四个就是表示传入的类型为字符串类型------------s1
第五个表示传入为字符串类型,n表示截取前n个数据拷贝到原对象 ------------s2
第六个表示传入为字符形式将n个c传入原对象,n表示传入字符的个数,c表示字符数据--s3
2,析构函数
当string对象动态开辟空间时,需要析构函数,由于是编译器自动调用,这次不进行详细的介绍
3,等号(=)运算符的重载
对于等号运算符的重载一共有三个,第一个是string类型,第二个是字符串类型,第三个是字符类型
来看一下例子:
void text_string2()
{std::string str1, str2, str3;str1 = "Test string: "; // c-stringstr2 = 'x'; // single characterstr3 = str1 + str2; // stringcout << str1 << endl;cout << str2 << endl;std::cout << str3 << '\n';
}
第一个调用参数为类对象的赋值---------str3
第二个调用参数为字符串类型的赋值-------str1
第三个调用参数为字符类型的赋值--------str2
四,Iterators(迭代器)
1,begin
返回第一个字符位置的迭代器,有两个类型第一个用在可修改的对象上,第二个用不可修改的对象上。
来看一组例子:
void text_string3()
{string s1("fjdsaklfjlasd");string::iterator it = s1.begin();cout << *it << endl;for (auto it : s1){cout << it ;}
}
第一个打印返回第一个位置的字符,此时的迭代器是指针,所以可以解引用,但是并不是所有的迭代器都是指针。
2,end
返回最后一个位置的迭代器, 有两个类型第一个用在可修改的对象上,第二个用不可修改的对象上。
来看一组例子:
void text_string4()
{string s1("fjdsaklfjlasd");string::iterator it = s1.end();//cout << *it << endl;cout << *(it-1) << endl;}
打印倒数第二个位置的字符,最后一个位置的字符是用来判断结束条件。当使用迭代器解引用打印最后一个位置的字符会报错。
3,rbegin
返回最后一个字符位置的迭代器,有两个类型第一个用在可修改的对象上,第二个用不可修改的对象上。
来看一组例子:
oid text_string5()
{string s1("ffdasfaj");cout << s1[8] << endl;string::reverse_iterator it = s1.rbegin();//cout << *it << endl;cout << *it << endl;}
打印的是最后一个有效字符(倒数第二个位置),当rbegin进行++操作是往字符串前面走 。
4,rend
返回end位置的迭代器,也就是最后一个位置 。有两个类型第一个用在可修改的对象上,第二个用不可修改的对象上。
来看一组例子:
void text_string6()
{string s1("ffdasfaj");cout << s1[8] << endl;string::reverse_iterator it = s1.rend();cout << *(it-1) << endl;cout << *it << endl;}
当时(rend-1)时打印了第一个位置的字符,rend是发生了报错,因为rend和end指向的是一个位置,所以报错原因都是一样的。
要注意的是rbegin和rend的++,--都是相反的,要和begin和end区别开。
五,关于容量的成员函数
1,size
返回有效字符的个数。
来看一组例子:
void text_string10()
{string s1("ffdasfaj");cout << s1.size() << endl;
}
需要注意是有效字符,不包括最后判断字符,以及和容量的大小无关
2,length
length和size的用法完全一致。
3,max_size
返回字符串能达到的最大长度,主要用于对字符串对象一个最大长度的限制。
4,resize
作用于对长度的修改,两个类型,表示对string对象长度修改为n。
分为两种情况,当n小于size时,删除size之后的数据。当n大于size时对string对象进行扩容填充,直到填充到n个字符,第一个类型进行默认填充,第二个类型自己输入字符填充。
来看一组例子:
void text_string11()
{string s1("ffdasfaj");cout << s1.size() << endl;cout << s1 << endl;s1.resize(5);cout << s1.size() << endl;cout << s1 << endl;s1.resize(20);cout << s1.size() << endl;cout << s1 << endl;s1.resize(25,'b');cout << s1.size() << endl;cout << s1 << endl;
}
原对象是8个字符,长度为8,第一个resize(5)小于size,这个函数会对此对象删除5以后的数据
。第二个resize(20)大于size,没有传入参数,编译器填入默认参数。第三个resize(25),比size大
5,所以填入5个b。
5,capacity
计算string对象容量的大小,并不等于size的长度。
6,reverse
对string对象的容量进行改变。函数参数n大于对象容量,会对该对象进行扩容,扩容的大小大于等于n。当n小于对象容量,若n小于size则对该对象不做处理。若n大于size小于容量,这种情况编译器自行处理,可能缩容也可能不做处理。
来看一组例子:
void text_string12()
{string s1("ffdasfaj");cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;string s2("ffdasfaj");s1.reserve(5);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;string s3("ffdasfaj");s1.reserve(20);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;s1.reserve(15);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;
}
第一组数据对原对象的size,capacity记录原始数据。
第二组当n小于size时,size,capacity都不变数据不受影响
第三组当n大于capacity时,size不变,capacity进行扩容,进行整数倍扩容,capacity大于n
第四组当n大于size小于capacity时,size不变,capacity进行缩容
7,clear
清除字符串,使得size为0,capacity不变
来看一组例子:
void text_string13()
{string s1("ffdasfaj");cout << s1.size() << endl;cout << s1.capacity() << endl;s1.clear();cout << s1.size() << endl;cout << s1.capacity()<< endl;
}
8,empty
仅仅判断string对象是否为空,不影响string里面的内容。
0为true,其他值为false。
六,元素存取相关函数
1,操作符重载[]
这个函数有两种形式,第一种对于不修改字符对象内容,第二种用于修改字符对象。[]的重载,使得string类型的对象直接使用[]返回索引位置的引用。
下面来看一组例子:
void text_string7()
{string s1("ffdasfaj");cout << s1[0] << endl;s1[0] = 'g';cout << s1[0] << endl;//cout << s1[100] << endl;}
[]操作符通过返回值可以对指定位置进行修改,里面的操作数如果大于size,会显示未定义错误
2,at
at的功能和[]一致,只有在操作数大于size时,at会报out_of_range错误。
3,back
作用于string返回最后有效字符的引用,同样有两种类型,第一种可以修改string的内容,第二种则不可以进行修改。
来看一组例子:
void text_string8()
{string s1("ffdasfaj");cout << s1.back() << endl;s1.back() = 'g';cout << s1.back() << endl;
}
可以通过引用来修改最后一个字符的值,此函数不能用于空对象,会显示未定义报错。
4,front
返回第一个位置字符的引用 ,和begin函数相似。有两种类型,第一种可以修改string的内容,第二种则不可以进行修改。
来看一组例子:
void text_string9()
{string s1("ffdasfaj");cout << s1 << endl;s1.front() = 'g';cout << s1 << endl;
}
可以通过引用来修改第一个字符的值,此函数不能用于空对象,会显示未定义报错。
七,修饰对象相关函数
1,+=运算符重载
返回string对象的引用,在string对象的尾部插入string对象,字符串,或者字符。
来看一组例子
void text_string1()
{string s1;string s2 = "fasljl";s1 += s2;cout << s1 << endl;s1 += "aaaaa";cout << s1 << endl;s1 += 'm';cout << s1 << endl;}
第一组实现对象之间的加等
第二组实现对象与字符串之间的加等
第三组实现对象与字符类型的加等
当容量不够时,自动进行扩容
2,append
实现对原字符串的尾部插入,和(+=)功能相似。
第一个str表示子对象,实现子对象对原对象尾部的插入。
第二个str表示子对象,subpos表示子对象开始的位置(起点为0),sublen表示从起点开始的长度。
此函数表示将从subpos开始的位置向后sublen个长度的内容,尾插到原对象。subpos大于str长度时报out_of_range错误。
第三个s表示字符串,将字符串尾插到元对象
第四个s表示字符串,n表示起点的位置。此函数表示从起点开始的位置一直到结尾的内容尾插到原对象。
第五个n表示个数,表示字符。此函数将n个字符尾插到原对象。
来看一组例子:
void text_string2()
{string s1;string s2 = "fasljl";string s3;s1.append( s2);cout << s1 << endl;s1.append(s2, 0, 2);cout << s1 << endl;s3.append("aaaaa");cout << s3 << endl;s3.append("bbbbbbb", 3);cout << s3 << endl;s3.append(3,'p');cout << s3 << endl;}
第一组表示对象之间
第二组表示对象与指定对象区间之间
第三组表示对象与字符串之间
第四组表示对象与指定字符串区间之间
第五组表示对象与字符之间,注意必须要传字符个数,不支持只传入单个字符
注意:在字符串或者字符没有进行初始化操作时,都会出现抛出异常
3,push_back
尾插单个字符,此函数实现了单个字符传入 ,字符没有初始化会有抛出异常。
4,assign
注意功能就是代替原对象,分为下面五种
第一个str表示子对象,实现子对象对原对象的替换
第二个str表示子对象,subpos表示子对象开始代替的位置,sublen从开始代替的位置向后的长度。此函数表示从subpos位置开始sublen个长度的内容,代替到原对象。
第三个s表示字符串,将字符串的内容代替到原对象
第四个s表示字符串,n表示起始位置。此函数表示从起始位置开始一直到字符串结束的内容,替换到原对象。
第五个n表示字符个数,c表示字符。此函数将n个字符替换到原对象
来看一组例子
void text_string3()
{string s1 = "fsdjlkjkfsdlj";string s2 = "fasljl";string s3;s1.assign(s2);cout << s1 << endl;s1.assign(s2, 0, 2);cout << s1 << endl;s3.assign("aaaaa");cout << s3 << endl;s3.assign("bbbbbbb", 3);cout << s3 << endl;s3.assign(3, 'p');cout << s3 << endl;}
第一组表示对象之间的代替
第二组表示对象与指定对象区间的代替
第三组表示对象与字符串之间的代替
第四组表示对象与指定字符串区间的代替
第五组表示对象与指定个数字符之间的代替
注意:这些代替过程中,子对象,子字符串,子字符不受影响。原对象的原有数据全部被子数据代替。
5,insert
这个函数的功能在指定位置插入数据,分为下面五个部分
第一个,pos指原对象的指定位置,str表示子对象。将子对象的数据插入到元对象指定位置之前的位置。
第二个,pos指原对象的指定位置,str表示子对象,subpos表示子对象的指定位置,sublen表示子对象的数据长度。此函数表示将子对象从subpos位置开始sublen长度的数据插入到原对象pos位置之前。
第三个,pos指原对象的指定位置,s表示字符串。将字符串传入pos位置之前。
第四个,pos指原对象的指定位置,s表示字符串,n表示起始位置。此函数表示从n开始一直到字符串结束的数据插入到pos之前。
第五个,pos指原对象的指定位置,,n表示字符个数,c表示字符。将n个字符插入到pos之前的位置。
来看一组例子:
void text_string4()
{string s1 = "fsdjlkjkfsdlj";string s2 = "fasljl";string s3;s1.insert(0,s2);cout << s1 << endl;s1.insert(0,s2, 0, 2);cout << s1 << endl;s3.insert(0,"aaaaa");cout << s3 << endl;s3.insert(0,"bbbbbbb", 3);cout << s3 << endl;s3.insert(0,3, 'p');cout << s3 << endl;}
第一组表示对象与对象之间
第二组表示对象与指定对象区间之间
第三组表示对象与字符串之间
第四组表示对象对指定区间字符串之间
第五组表示对象与n个字符之间。
注意:当指定区间超出所在字符串或者对象长度时会抛异常。
6,erase
此函数和clear相似,erase可以进行指定位置和指定长度的删除,若长度不传参数则表示从指定位置到最后全部删除。若pos超出对象范围,则会抛异常。
7,replace
此函数实现子数据对原对象指定区域的替换,和assign相似。
第一个,pos指定原对象位置,len字符长度,str表示子对象。此函数表示,从pos位置开始len个数据的内容由str对象数据代替。
第二个,pos指定原对象位置,len字符长度,str表示子对象,subpos表示子对象的起始位置,sublen长度。此函数表示将子对象从subpos位置之后sublen长度的数据代替原对象从pos开始len个长度的数据。
第三个,pos指定原对象位置,len字符长度,s表示字符串,此函数表示将字符串的数据替换到原对象从pos位置开始len个长度的数据。
第四个,pos指定原对象位置,len字符长度,s表示字符串,n表示起始位置。此函数表示对子字符串从n开始位置到末尾的数据替换到原对象从pos位置开始len个字符的内容
第五个,pos指定原对象位置,len字符长度,n代表数据个数,c表示字符。此函数表示将n个字符替换到原对象从pos位置开始len个长度的内容。
下面来看一组例子
void text_string5()
{string s1 = "fsdjlkjkfsdlj";string s2 = "aaaaaaaaaa";string s3 = "llllllll";s1.replace(0, 2, s2);cout << s1 << endl;s1 = "fsdjlkjkfsdlj";s1.replace(0, 2, s2, 0, 2);cout << s1 << endl;s3.replace(0, 2, "aaaaa");cout << s3 << endl;s3 = "llllllll";s3.replace(0, 2, "bbbbbbb", 3);cout << s3 << endl;s3 = "llllllll";s3.replace(0, 3, 4, 'p');cout << s3 << endl;}
第一组表示对象与对象之间
第二组表示对象与指定对象区间之间
第三组表示对象与字符串之间
第四组表示对象对指定区间字符串之间
第五组表示对象与n个字符之间。
注意:pos和subpos当越界时会抛异常
8,swap
实现两个对象的交换
9,pop_back
erase最后一个有效字符,当字符对象为空时,会显示未定义错误。
八,针对字符串相关函数
1,c_str
返回一个指向首字符的数组指针。
2,get_allocator
返回一个分配器对象的副本
3,copy
将原对象的指定内容拷贝到s数组中,pos指原对象的位置,len指拷贝长度
来看一组例子
void text_string6()
{string s1 = "fsdjlkjkfsdlj";char arr[100]= "0";cout << s1.copy(arr,2,0) << endl;cout << arr << endl;}
相当于从原对象指定内容拷贝到数组中
4,find
数据与原对象的匹配函数,匹配成功返回数据的下标
第一个,str子对象,pos指开始匹配的的位置。此函数表示从pos位置开始和子对象进行匹配
第二个,s字符串,pos指开始匹配的位置。此函数表示从pos位置开始和字符串进行匹配
第三个,s字符串,pos指开始匹配的位置,n字符串需要匹配的长度。此函数表示从pos位置开始匹配,匹配字符串前n个数据。
第四个,pos位置开始匹配匹配c字符。
来看一组例子
void text_string7()
{string s1 = "fsdjlkjkfsdlj";string s2 = "jlk";cout << s1.find(s2,0) << endl;cout << s1.find(s2, 3) << endl;cout << s1.find(s2, 4) << endl;cout << s1.find("sdj", 0) << endl;cout << s1.find("sdj", 3) << endl;cout << s1.find("sdj", 3,1) << endl;cout << s1.find('j', 4) << endl;
}
第一组匹配成功返回下标3
第二组匹配成功返回下标3
第三组匹配失败返回 npos
第四组匹配成功返回下标1
第五组匹配失败返回 npos
第六组匹配成功返回下标9,这匹配一个字符s
第七组匹配成功返回下标6
5,rfind
倒着查找,pos表示查找范围为pos以及pos之前,其余参数都和find一致
6,find_first_of
当匹配数据的第一个数据匹配成功就算成功,参数和find一致
7,find_last_of
当匹配数据的最后一个有效数据匹配成功就算成功,参数和rfind一致
8,substr
构造一个新的对象,将原对象的指定数据拷贝的新构造的数据,pos指开始的位置,len指拷贝长度。
来看一组例子:
void text_string8()
{string s1 = "fsdjlkjkfsdlj";cout << s1.substr(0, 3) << endl;cout << s1.substr(0) << endl;cout << s1.substr(4) << endl;}
此函数生成一个临时对象。
9,compare
比较原对象和子对象,子字符串。pos,len修饰原对象,分别代表起始位置和跨越长度。subpos,和sublen,修饰子对象 ,分别代表起始位置和跨越长度。n表示子字符串开始比较的起始位置。
九,全局函数
1,+运算符重载
两个类型相加,构造出一个新的string对象,该对象为临时对象
2,>>运算符重载
可以输入string类型的变量
3,<<运算符重载
可以输出string类型的对象
4,getline
向比较于>>此函数遇到空格不停止读入,遇到换行结束。
十,总结
有几个重要的接口(size,resize,reserve,=,+=,empty,clear,getline,find)需要熟悉掌握,其他的接口注意进行了解,当需要的时候可以通过查文档的方式进行了解如何去使用。
相关文章:
C++--string类对象
一,引言 string类对象在于更好的处理字符串问题,为对于字符串这一类型提供更加方便的接口和运算符的重载。本片文章首先会引入auto关键字和范围for两个C11小语法。之后按照如下网站所提供的顺序经行讲解。cplusplus.com - The C Resources Networkhttps://legacy.c…...
云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)
在上篇中,我们围绕存储系统可扩展架构详细探讨了基础技术原理与典型实践。然而,在实际应用场景中,存储系统面临的挑战远不止于此。随着数据规模呈指数级增长,业务需求日益复杂多变,存储系统还需不断优化升级࿰…...
Python _day31
DAY 31 文件的规范拆分和写法 今日的示例代码包含2个部分 notebook文件夹内的ipynb文件,介绍下今天的思路项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文…...
【JavaWeb】MyBatis
1 介绍 什么是MyBatis? MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。 MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis官网https://my…...
vue2实现【瀑布流布局】
瀑布流 1. 解释2. 形成结构和样式3. 自定义指令 1. 解释 瀑布流特征: 等宽不等高:元素宽度固定,高度根据内容自适应。错落排列:元素像瀑布一样从上到下依次填充,自动寻找最短列插入 体现:图中第一排1&…...
系统架构设计(十六):敏感点、权衡点、风险点和非风险点
术语定义 概念定义说明敏感点(Sensitivity Point)架构设计中对某个质量属性有显著影响的点,一旦改变该点,会显著影响系统的某个质量属性。风险点(Risk Point)由于架构决策带来的潜在失败风险,可…...
优化dp贪心数论
这次三个题目都来自牛客周赛93,个人觉得出的很好,收获颇多。 1.简单贪心 题目意思: 任意选定两个数字,相加之和替代两个数字中的一个,另一个抹除。求操作之后最大字典序之和 思路: 最大字典序之和&…...
详解MySQL 的 binlog,redo log,undo log
MySQL 的 binlog、redo log 和 undo log 是数据库事务处理与数据一致性的核心组件,各自承担不同的职责。 1. binlog(二进制日志) 定位:MySQL Server 层实现的逻辑日志,与存储引擎无关。作用: 主从复制&…...
SymPy|主元、重新表示、分数、约分表达式、极限、级数、ode、获取值、输出形式
SymPy 是一个 Python 的符号计算库,广泛应用于数学计算、物理建模、工程分析等领域。本文将详细介绍 SymPy 在处理主元操作、重新表示、分数、约分表达式、极限、级数、常微分方程(ODE)以及获取值和输出形式等方面的应用,通过完整…...
Java 05正则表达式
正则表达式 1.简介 一个字符串,指定一些规则,来校验其他的字符串 String s"";规则 需要进行匹配的字符串.matches(s);来判断2.字符类**(单个) [abc] String s"[ABC]"; "A".matches(s);返回true…...
IEEE 802.1Q协议下封装的VLAN数据帧格式
1.概要 802.1d定义了生成树 802.1w定义了快速生成树 802.1s定义了多生成树 802.1q定义了VLAN 2.说明 IEEE802.1q协议的作用是(生成VLAN标记)VLAN编号取值范围:0-4095,其中0和4095是保留编号,所最大值是ÿ…...
VMware三种网络配置对比
桥接模式(Bridged Mode) 核心特点: 虚拟机被视为局域网中的独立设备,直接使用物理网络适配器,需配置与宿主机同一网段的IP地址。 典型场景: 虚拟机需对外提供服务(如Web…...
再来1章linux系列-19 防火墙 iptables 双网卡主机的内核 firewall-cmd firewalld的高级规则
学习目标: 实验实验需求实验配置内容和分析 (每一个设备的每一步操作)实验结果验证其他 学习内容: 实验实验需求实验配置内容和分析 (每一个设备的每一步操作)实验结果验证其他 1.实验 2.实验需求 图…...
Word 转 HTML API 接口
Word 转 HTML API 接口 图像/转换 Word 文档转换为 HTML 文件转换 / 超高精度与还原度 文件转换 / Word。 1. 产品功能 超高精度与还原度的 HTML 文件转换;支持将 Word 文档转换为 HTML 格式;支持 .doc 和 .docx 格式;保持原始 Word 文档的…...
深入解析MATLAB codegen生成MEX文件的原理与优势
一、MATLAB codegen底层工作机制 1.1 MATLAB执行引擎的局限性 MATLAB作为解释型语言,其执行过程包含多个关键步骤: 语法解析:将.m文件代码转换为抽象语法树(AST) 类型推断:运行时动态确定变量类型 内存管理:自动处…...
PEFT简介及微调大模型DeepSeek-R1-Distill-Qwen-1.5B
🤗 PEFT(参数高效微调)是由Huggingface团队开发的开源框架,专为大型预训练模型(如GPT、LLaMA、T5等)设计,用于高效地将大型预训练模型适配到各种下游应用,而无需对模型的所有参数进行…...
Python训练营打卡 Day31
文件的规范拆分和写法 今日的示例代码包含2个部分 notebook文件夹内的ipynb文件,介绍下今天的思路项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法 知识点回顾:文件…...
Google精准狙击OpenAI Codex,发布AI编程助手Jules!
自从OpenAI推出 Codex之后,Google就憋不住了,悄悄得瞄准了OpenAI的最新成果。 原计划是是打算在明天举行的Google I/O年度开发者大会上发布相关产品,但Google似乎已经一刻也等不了了。 就在昨天,谷歌正式推出了其AI编程——Ju…...
【办公类-18-04】(Python)“验血单信息”批量生成打印(学校、班级、姓名、性别)
背景说明 督导结束了,准备春游(夏游),搭档在给孩子写打卡单、心愿单,感慨“好多字都不会写了!” 此时,保健老师来发体检材料,叮嘱红色验血单的填写方法。 我觉得我的字也是一塌糊涂。我想用以前做“毕业证书”的方式,将班级幼儿信息打印在体检单上。 【办公类-18-03…...
如何使用通义灵码提高前端开发效率
工欲善其事,必先利其器。对于前端开发而言,使用VSCode已经能够极大地提高前端的开发效率了。但有了AI加持后,前端开发的效率又更上一层楼了! 本文采用的AI是通义灵码插件提供的通义千问大模型,是目前AI性能榜第一梯队…...
苍穹外卖04 新增菜品菜品分页查询删除菜品修改菜品
2-6 新增菜品 02 05-新增菜品_需求分析和设计 03 06-新增菜品_代码开发_1 文件上传接口开发: 在这一部分我们主要在于对阿里云oss的代码开发和实现 1.配置阿里云oss: alioss:endpoint: oss-cn-beijing-internal.aliyuncs.comaccess-key-id: access-ke…...
C++ 读取英伟达显卡名称、架构及算力
C++ 读取英伟达显卡名称、架构及算力 通过CUDA Runtime API获取计算能力(推荐)CUDA计算能力(Compute Capability)的版本号直接对应显卡架构(如8.6=Ampere,9.0=Hopper)。实现步骤: 1.安装依赖: 安装 NVIDIA CUDA Toolkit。确保显卡驱动支持CUDA。2. C…...
VitePress 中以中文字符结尾的字体加粗 Markdown 格式无法解析
背景 在编写vitepress项目过程中,发现了一个markdown格式解析的问题。 md文件中,以中文句号结尾的字体加粗,无法正确解析: 不只是中文句号,只要是加粗语句中以中文字符结尾,都无法被正确解析 需要将中文…...
2.前端汇总
框架 html5 html语法 css css3 css语法 框架 tailwind css 官网 JavaScript JavaScript语法 typescript 语法 nodejs 语法 vue3 官网 组件 vite 打包 vue router -路由 pinia - 状态管理 ui element plus axios - ajax 后台管理系统前端快速开发框架 …...
外部因素导致的 ADC误差来源分析
前面分享了ADC自身因素带来的误差,现在再分享一波由于外部因素导致的ADC采样误差。 一、模拟信号源输入减少带来的误差 看一个STM32的ADC转换器的示意图: 从图中可以看到,输入源与采样引脚之间存在阻抗RAIN,流入引脚的电压可能因…...
集成运算放大器知识汇总
一、集成运放的组成 集成运算放大器,就是通过内部元器件的电参量关系将电参量进行运算,达到放大的目的。我们拆解来看: 集成:将电路封装,留出接口,使其模块化,便于移植。运算:这里…...
HBCPC2025 补题 (F、I)
HBCPC2025 补题 补题连接:Codeforces I 感染 做法1:std做法:树上dp统计贡献找最大 #include <bits/stdc.h> using namespace std; typedef long long ll; #define endl \n #define int long long #define pb push_back #define pii pair<int,…...
针对 CSDN高质量博文发布 的详细指南
结合技术写作规范与平台特性,分为 内容规划、写作技巧、排版优化、发布策略 四部分,确保专业性与传播效果: 一、内容规划:精准定位与深度挖掘 选题策略 热点结合:追踪技术趋势(如2025年AIGC、量子计算&am…...
python读写bin文件
import numpy as np# 创建二进制数据 data np.array([0x33, 0x34, 0x35, 0x36], dtypenp.uint8)# 写入bin文件 with open(example.bin, wb) as f:data.tofile(f)print("bin文件生成成功")data np.fromfile(example.bin, dtypenp.uint8) print("numpy读取结果:…...
矩阵的秩(Rank)
矩阵的秩(Rank)是线性代数中的核心概念,表示矩阵中线性无关的行(或列)的最大数量,反映了矩阵所包含的“独立信息”的多少。以下是其核心要点: 1. 秩的定义 行秩:矩阵中线性无关的行…...
Vue响应式系统演进与实现解析
一、Vue 2 响应式实现详解 1. 核心代码实现 // 依赖收集器(观察者模式) class Dep {constructor() {this.subscribers new Set();}depend() {if (activeEffect) {this.subscribers.add(activeEffect);}}notify() {this.subscribers.forEach(effect &g…...
【SPIN】高级时序规范(SPIN学习系列--6)
时序操作符[](总是)和 <>(最终)可应用于任何LTL公式,因此 []<><>A 和 <>[]<>(A ∧ []B) 在语法上是正确的。本书不涉及LTL的演绎理论(如公理、推理规则及公式的结合律、交换…...
C语言学习之内存函数
今天我们来学习一下C语言中内存函数 以下内存函数的使用均需要包含头文件<string.h> 目录 memcpy函数的使用及其模拟实现 memcpy函数的模拟实现 memmove函数的使用和模拟实现 memmove函数的模拟实现 memset函数的使用 memcmp函数的使用 memcpy函数的使用及其模拟实现…...
Python 数据库编程
一、数据库连接基础 1. 标准流程 import database_module # 如mysql.connector, sqlite3等 # 1. 建立连接 connection database_module.connect( host"localhost", user"username", password"password", database"dbnam…...
软考软件评测师——软件工程之开发模型与方法
目录 一、核心概念 二、主流模型详解 (一)经典瀑布模型 (二)螺旋演进模型 (三)增量交付模型 (四)原型验证模型 (五)敏捷开发实践 三、模型选择指南 四…...
机器学习入门
机器学习入门 1 . 机器学习是什么? 机器学习(Machine Learning, ML)是一种用数据经验替代显式规则编程来完成任务的方法──模型从样本 (X, y) 中学习 映射函数 f: X → Y,并在新样本上做出预测。和传统“if … else”程序相比&…...
git学习与使用(远程仓库、分支、工作流)
文章目录 前言简介git的工作流程git的安装配置git环境:git config --globalgit的基本使用新建目录初始化仓库(repository)添加到暂存区新增/修改/删除 文件状态会改变 提交到仓库查看提交(commit)的历史记录git其他命令…...
制造业或跨境电商相关行业三种模式:OEM、ODM、OBM
一、基础概念对比 模式定义核心能力利润来源控制权OEM代工生产(贴牌生产)纯生产制造能力加工费(薄利)品牌方掌控一切ODM设计生产(自主设计代工)设计研发能力设计溢价生产利润制造商掌握设计OBM自主品牌&am…...
APPtrace 智能参数系统:重构 App 用户增长与运营逻辑
一、免填时代:APPtrace 颠覆传统参数传递模式 传统 App 依赖「邀请码 / 手动绑定」实现用户关联,流程繁琐导致 20%-30% 的用户流失。APPtrace 通过 **「链接参数自动传递 安装后智能识别」** 技术,让用户在无感知状态下完成关系绑定、场景还…...
在 Excel 中使用 C# .NET 用户定义函数 操作步骤
点开选项 点击加载项 点击跳转 点击浏览 选择仙盟excel...
PyTest
一、基本用法: 1.测试框架做了什么: (1).测试发现 a.创建test_开头的文件 b.创建Test开头的类 c.创建test_开头的函数或方法 pytest中以每一个函数或方法作为一个用例 pytest主要以名字区分普通函数(方法)、用例 pytest的启动方式:在给定的项目中执行pytest命令即可 p…...
Python Day27 学习
今天学习讲义Day17的内容:无监督算法中的聚类浙大疏锦行 Q1. 什么是聚类? 本质上就是一种分组分类 关于聚类的准备工作: 代码实现 # 先运行之前预处理好的代码 import pandas as pd import pandas as pd #用于数据处理和分析ÿ…...
在 Win 10 上,Tcl/Tk 脚本2个示例
set PATH 新增 D:\Git\mingw64\bin where tclsh D:\Git\mingw64\bin\tclsh.exe where wish D:\Git\mingw64\bin\wish.exe 编写 test_tk.tcl 如下 #!/usr/bin/tclsh # test 文件对话框 package require Tk# 弹出文件选择对话框,限制选择.txt文件 set filePath […...
渐开线少齿差传动学习笔记
之前看到了一个渐开线一齿差的视频,觉得比较有意思,想自己动手做一个看看,下面是最开始尝试的一个失败的结果,不知道小伙伴们发现问题了没? 本来就是想凑一凑看看,但是发现不是凑起来不是件容易的事。那么…...
基于CATIA参数化圆锥建模的自动化插件开发实践——NX建模之圆锥体命令的参考与移植(二)
引言 在CATIA二次开发领域,参数化建模技术可提升复杂几何体的创建效率达60%。本文基于PySide6 GUI框架与pycatia接口库,深度解析锥体自动化建模工具的开发实践。该工具创新性地融合了NX的交互逻辑与CATIA的混合建模技术,实现双模式输入(高度/锥角)的智能参数转换,较传统…...
Java集合框架详解:单列集合与双列集合
目录 1. 引言:为什么需要集合框架 2. 基础概念:集合框架概述 2.1 集合框架的结构 编辑 编辑 2.2 集合与数组的比较 3. 前置知识:理解集合框架背后的基础数据结构 3.1 数组 3.2 链表 3.3 哈希表 3.4 二叉树与二叉查找树 3.5 红…...
leetcode 33. Search in Rotated Sorted Array
题目描述 可以发现的是,将数组从中间分开成左右两部分的时候,一定至少有一部分的数组是有序的。左部分[left,mid-1],右部分[mid1,right]。 第一种情况:左右两部分都是有序的,说明nums[mid]就是整个数组的最大值。此时…...
OpenCV 图像色彩空间转换
一、知识点: 1、色彩空间转换函数 (1)、void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0, AlgorithmHint hint cv::ALGO_HINT_DEFAULT ); (2)、将图像从一种颜色空间转换为另一种。 (3)、参数说明: src: 输入图像,即要进行颜…...
python-leetcode 69.最小栈
题目: 设计一个支持push,pop,top,操作,并能在常数时间内检索到最小元素的栈。 辅助栈法: 1:使用两个栈,一个主栈用于存储所有元素,另一个辅助栈用于存储当前元素的最小值 2: 每次push时,将元…...
C#基础:yield return关键字的特点
一、特点 1.最终返回的结果是IEnumerable<T> 2.使用yield return时,返回的是单个元素(即T) 3.好处:延迟加载,需要时才计算 二、验证 通过打断点可知,只有当listB遍历的时候,才会进入Get…...