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

C++:string

一、string概念
之前介绍过通过字符数组保存字符串,然后对字符数组中的字符串做各种操作;为了更加简单方便,在C++中,又增加了 string 来处理字符串。
char str[20] = "hello world";
string 字符串其实是一种更加高级的封装, string 字符串中包含大量的方法,这些方法使得字符串的操作变得更加简单。那到底什么是string呢?C++中将字符串直接作为一种类型,也就是 string 类型,使用  string 类型创建的对象就是C++ 的字符串。
string s1;
string s2 = "abc";
使用 C++ 中提供的 string 时,必须添加头文件 <string>。
二、string 常见操作
1. 创建字符串
string s1;//创建空字符串
string s2 = "abc";//创建字符串
#include <iostream>
#include <string> //添加string头文件
using namespace std;
int main()
{string s1;string s2 = "hello world";cout << "s1:" << s1 << endl; //s1:cout << "s2:" << s2 << endl; //s2:hello worldreturn 0;
}
创建字符串的方式与前面学习到创建内置数据类型的方式相同,只是这里的字符串类型为 string
(1)string s1 表示创建空字符串,相当于创建整型 int a ,但未给 a 一 个初始值。
(2) string s2 = "hello world" 表示创建一个字符串s2,它的内容是" hello world ",要 注意 s2 中的字符串不再以 \0 作为结束标志了。(C 语言风格的字符串是以 \0 作为结束标志 的)后面还会介绍别的创建字符串的方法,但这种方法是最常见的。
上面这个图,仅仅是字符串s2的示意图,实际上 string 类型的字符串比这个要复杂的多,我们可以大概这样去理解,更多的知识需要学习C++的类和对象的知识才能明白。
当然C++中的 string 创建的字符串和 char 类型的数组所表示的字符串还有一个区别, string 类型的字符串对象可以直接赋值,比如:
#include <iostream>
#include <string>
using namespace std;
int main()
{string s1("hello world");string s2("hehe");s2 = s1;cout << s2 << endl;return 0;
}

除了以上创建字符串的写法外,C++中还有一些其他的创建字符串方式。如:

string s("hello world"); //等同于string s1 = "hello world";
string s1 = s; //⽤⼀个现成的字符串s,初始化另外⼀个字符串s1
2. string字符串的输入
(1) cin的方式
可以直接使用  cin string 类型的字符串中输入一个字符串的数据。
#include <iostream>
#include <string>
using namespace std;
int main()
{string s;//输入 cin >> s;//输出cout << s << endl;return 0;
}
其实 cin 的方式给 string 类型的字符串中输入数据的时候,可以输入不带空格的字符串。但是如果带有空格,遇到空格也就读取结束了,没有办法正常读取,那怎么办呢?解决办法就是使用 
getline 。
(2) getline 的方式
getline 是C++标准库中的一个函数,用于从输入流中读一行文本,并将其存储为字符串。getline 函数有两种不同的形式,分别对应着字符串的结束方式。
istream& getline (istream& is, string& str);
istream& getline (istream& is, string& str, char delim);
istream 是输入流类型, cin 是 istream 类型的标准输入流对象。
ostream 是输出流类型, cout 是 ostream 类型的标准输出流对象。
getline 函数是输入流中读取一行文本信息,所有如果是在标准输入流(键盘)中读取数据,就可以传 cin 给第一个参数。
第一种 getline 函数以换行符( '\n' )作为字符串的结束标志,它的一般格式是:
getline(cin, string str)
//cin -- 表⽰从输⼊流中读取信息
//str 是存放读取到的信息的字符串
这种形式的 getline 函数从输入流( 例如 cin )中 读取文本,直到遇到换行符( '\n' )为止,然后将读取到的文本(不包括换行符)存储到指定的 string 类型的变量 str 中。
#include <iostream>
#include <string>
using namespace std;
int main ()
{string name;getline (cin, name);cout << name << endl;return 0;
}
第二种 getline 函数允许用户自定义结束标志,它的一般格式是:
getline(cin, string str, char delim)
//cin -- 表⽰从输⼊流中读取信息
//str 是存放读取到的信息的字符串
//delim 是⾃定义的结束标志
这种形式的 getline 函数从输入流中读取文本,直到遇到用户指定的结束标志字符( delim )为止,然后将读取到的文本(不包括结束标志字符)存储到指定的 string 类型的变量 str 中。
#include<iostream>
#include <string>
using namespace std;
int main ()
{string name;getline (cin, name, 'q');cout << name << endl;return 0;
}
在使用C++中的 string 字符串时,想要输入的字符串中包含空格,那么 getline 函数就是必须的。在竞赛中为了方便处理字符串,通常会使用 string 类型的字符串,所以在字符串输入的时候 getline 就很常见。
3. size()
string 中提供了 size() 函数用于获取字符串长度。
使用示例:
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s;string s1 = "hello";string s2 = "hello world";string s3 = "12ab!~ "; cout << "s:" << s.size() << endl;cout << "s1:" << s1.size() << endl;cout << "s2:" << s2.size() << endl;cout << "s3:" << s3.size() << endl;return 0;
}
需要注意的是,像 char int double 等内置类型的数据在操作的时候,我们是不会使用 . 操作符的。string 是 C++提供的一种更加复杂的封装类型,在 string 类型的变量中加入了操作这个字符串的各种方法(函数), 比如求字符串长度、字符串末尾插入⼀个字符等操作。所以要对 string 类型的变量进行各种操作,就可以使用  . 操作符来使用这些函数。
我们可以看下⾯的例⼦,⼤家要仔细体会。
通过 size() 能获得字符串的长度,顺便就可以使用这个长度遍历字符串的,注意 string 类型的字符串是可以通过下标访问的,比如:
#incldue <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdef";int i = 0;for(i = 0; i < s.size(); i++){cout << s[i] << " ";}return 0;
}

4.迭代器(iterator)

迭代器是一种对象,它可以用来遍历容器(比如 string )中的元素,迭代器的作用类似于指针,或者数组下标。访问迭代器指向的值,需要解引用(*)。
C++ 中的 string 提供了多种迭代器,用于遍历和操作字符串中的内容。这里给大家介绍一种最常
用的迭代器。
begin() end()
begin() :返回指向字符串第一个字符的迭代器,需要一个迭代器的变量来接收。
end() :返回指向字符串最后一个字符的下一个位置的迭代器(该位置不属于字符串)。
string begin() end() 返回的迭代器的类型是 string::iterator
迭代器是可以进行大小比较,也可以进行  + 或者 - 整数运算的。
比如: it++ ,就是让迭代器前进一步, it-- 就是让迭代器退后一步。
同一个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个数。
#include <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdef";string::iterator it1 = s.begin();string::iterator it2 = s.end();cout << (it1 < it2) << endl;cout << it1 - it2 << endl;return 0;
}
迭代器通常用于遍历字符串的,可以正序遍历,也可以逆序遍历。
正序遍历:
#include <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdef"; //auto it 是让编译器⾃动推到it的类型for (auto it = s.begin(); it != s.end(); ++it) { cout << *it << ' '; }//string::iterator 是正向迭代器类型//string::iterator it,是直接创建迭代器,it是针对字符串的迭代器for (string::iterator it = s.begin(); it != s.end(); ++it) { cout << *it << ' '; }return 0;
}
逆序遍历:
#include <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdef"; for (string::iterator it = s.end() - 1; it >= s.begin(); --it) { cout << *it << ' '; }return 0;
}
通过迭代器找到元素后,改变迭代器指向的元素,是可以直接改变字符串内容的。
#include <iostream>
#include <string>
using namespace std;
int main()
{string str = "abcdef"; cout << str << endl;for (string::iterator it = str.begin(); it != str.end(); ++it) { *it = 'x'; }cout << str << endl;return 0;
}
5.push_back()
push_back() 用 于在字符串尾部插一个字符。
使用示例:
#include <iostream>
#include<string> //添加string头⽂件
using namespace std;
int main()
{//向空字符串中尾插字符string s;s.push_back('h');s.push_back('e');s.push_back('l');s.push_back('l');s.push_back('o');cout << s << endl;//向⾮空字符串中尾插字符string s1 = "hello ";s1.push_back('w');s1.push_back('o');s1.push_back('r');s1.push_back('l');s1.push_back('d');cout << s1 << endl;//批量插⼊字符string s2;for (char c = 'a'; c <= 'f'; c++){s2.push_back(c);}cout << s2 << endl;return 0;
}
6.字符串的+=和+运算
push_back() 是用于在字符串后添加一个字符,然而部分情况下我们需要向原有的字符串后继续添
加字符串。
其实 string 类型的字符串是支持 + += 运算的。这里的本质是 string 中重载了operator+= 这个操作符。
具体使用请看下面的示例:
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello";s += " world"; //字符串⽤双引号,等价于 s = s + " world"cout << s << endl;//除了+=操作,也可以使⽤'+'灵活进⾏字符串拼接//1.尾部拼接string s1 = "hello";cout << s1 + " world" << endl; //s1仍然是"hello" s1 = s1 + " world";cout << s1 << endl; //s1是"hello world" //2.头部拼接string s2 = "hello";s2 = "world " + s2 ; cout << s2 << endl; //s2为:"world hello" return 0;
}
7.pop_back()
pop_back() 用 于删除字符串中尾部的一个字符。这个成员函数是在 C++11 标准中引入的,有的编
译器可能不支持。
使用示例:
#include <iostream>
#include<string>
using namespace std;
int main()
{string s = "hello";cout << "s:" << s << endl;//尾删s.pop_back();cout << "s:" << s << endl;//尾删s.pop_back();cout << "s:" << s << endl;return 0;
}
但是当字符串中没有字符的时候,再调用  pop_back() 时,程序会出现异常。这种行为也是未定义
行为,要避免使用。
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s;s.pop_back();return 0;
}
在DevC++上,程序最终崩溃了。
为避免循环删除导致对空字符串进行尾删,可以将删除全部字符的代码写成:
#include <iostream>
#include<string> //添加string头⽂件
using namespace std;
int main()
{string s = "abc";while(s.size() > 0) //通过size()函数来控制字符串的⻓度{s.pop_back();}return 0;
}
8.insert
如果我们需要在字符串中间的某个位置插入一个字符串,怎么办呢?这时候我们得掌握一个函数就是 insert。
函数原型如下:
string& insert (size_t pos, const string& str); //pos位置前⾯插⼊⼀个string字符串
string& insert (size_t pos, const char* s); //pos位置前⾯插⼊⼀个C⻛格的字符串
string& insert (size_t pos, size_t n, char c);//pos位置前⾯插⼊n个字符c
代码举例:
#include <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdefghi";string str = "xxx";cout << s << endl;s.insert(3, str);cout << s << endl;return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdefghi";cout << s << endl;s.insert(3, "xxx");cout << s << endl;return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{string s = "abcdefghi";cout << s << endl;s.insert(3, 3, 'x');cout << s << endl;return 0;
}
9.find()
find() 函数用于查找字符串中指定子串/字符,并返回子串/字符在字符串中第一次出现的位置。
size_t find (const string& str, size_t pos = 0) const;
//查找string类型的字符串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这个位置开始查找C⻛格的字符串s中的前n个字符,
size_t find (char c, size_t pos = 0) const;
//查找字符c,默认是从头开始,pos可以指定位置开始
返回值:
若找到,返回子串/字符在字符串中第一次出现的起始下标位置。
若未找到,返回一个整数 值 npos (针对 npos 的介绍 会在下面给出)。通常判断 find() 函数的返回值是否等于 npos 就能知道是否查找到子串或者字符。
代码举例:
//代码1
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello world hello everyone";string str = "llo";//查找string类型的字符串size_t n = s.find(str);//省略第二个参数,默认为0,从头开始cout << n << endl;n = s.find(str, n + 1); //从n+1这个指定位置开始查找cout << n << endl;//查找C⻛格的字符串n = s.find("llo");//省略第二个参数,默认为0,从头开始cout << n << endl;n = s.find("llo", n + 1); //从n+1这个指定位置开始查找cout << n << endl;return 0;
}
//代码2
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello world hello everyone";//在s中,0这个指定位置开始查找"word"中的前3个字符size_t n = s.find("word", 0, 3);cout << n << endl;n = s.find("everyday", n+1, 5);cout << n << endl;
return 0;
}
//代码3
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello world hello everyone";size_t n = s.find('o');cout << n << endl;n = s.find('o', n + 1);cout << n << endl;return 0;
}
//查找不到的情况
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello world hello everyone";string str = "bit";size_t n = s.find(str);cout << n << endl;if(n != string::npos)cout << "找到了,位置是:" << n << endl;elsecout << "没有找到" << endl;return 0;
}
在字符串中查找字符或者字符串时,有可能查找不到,这时候 find 函数会返 回 npos 这个值 ,该数
字并不是一个随机的数字,而是 string 中定义的一个静态常量 npos 。我们通常会判断 find 函数的返回值是否等于 npos 来判断,查找是否成功。
static const size_t npos = -1;
打印出来看看:
#include <iostream>
#include <string> //添加string头⽂件
using namespace std;
int main()
{//注意:npos是string中定义的,使⽤npos需要带上string::指明是string类中的cout << "npos:" << string::npos << endl; //npos:18446744073709551615return 0;
}
10.substr()
substr() 函数用于截取字符串中指定位置指定长度的子串。函数原型如下:
string substr (size_t pos = 0, size_t len = npos) const;
//pos 的默认值是0,也就是从下标为0的位置开始截取
//len 的默认值是npos,意思是⼀直截取到字符串的末尾
substr() :如果函数不传参数,就是从下标为0的位置开始截取,直到结尾,得到的是整个字符串;
substr(pos) :从指定下标 pos 位置开始截取子串,直到结尾;
substr(pos, len) :从指定下标 pos 位置开始截取长度为 len 的子串。
返回值类型: string ,返回的是截取到的字符串,可以使用  string 类型的字符串接收。
代码举例:
#include <iostream>
#include<string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello world hello everyone";string s1 = s.substr(7);cout << s1 << endl;string s2 = s.substr(7, 6);cout << s2 << endl;return 0;
}
substr() find() 经常是配合使用的, find 负责找到位置, substr 从这个位置向后获得字符串。
#include <iostream>
#include<string> //添加string头⽂件
using namespace std;
int main()
{string s = "hello world hello everyone";size_t n = s.find("world");string s2 = s.substr(n, 10);cout << s2 << endl;return 0;
}
11.string的关系运算
在实际写代码的过程中经常会涉及到两个字符串比较大小,比如:判断你输入的密码是否正确,就得将输入的密码和数据库中正确的密码比较。
那么两个 string 类型字符串是否可以比较大小呢?其实是可以的,C++中为string提供了一系列的关系运算。
支持的关系运算:
string s1 = "abc";
string s2 = "abcd";
char s3[] = "abcdef"; //C⻛格的字符串
(1) s1 == s2
bool operator== (const string& lhs, const string& rhs);//使⽤⽅式:s1 == s2
bool operator== (const char* lhs, const string& rhs);//使⽤⽅式:s3 == s1
bool operator== (const string& lhs, const char* rhs);//使⽤⽅式:s1 == s3
(2) s1 != s2
bool operator!= (const string& lhs, const string& rhs);//使⽤⽅式:s1 != s2
bool operator!= (const char* lhs, const string& rhs);//使⽤⽅式:s3 != s1
bool operator!= (const string& lhs, const char* rhs);//使⽤⽅式:s1 != s3
(3) s1 < s2
bool operator< (const string& lhs, const string& rhs);//使⽤⽅式:s1 < s2
bool operator< (const char* lhs, const string& rhs);//使⽤⽅式:s3 < s1
bool operator< (const string& lhs, const char* rhs);//使⽤⽅式:s1 < s3
(4) s1 <= s2
bool operator<= (const string& lhs, const string& rhs);//使⽤⽅式:s1 <= s2
bool operator<= (const char* lhs, const string& rhs);//使⽤⽅式:s3 <= s1
bool operator<= (const string& lhs, const char* rhs);//使⽤⽅式:s1 <= s3
(5) s1 > s2
bool operator> (const string& lhs, const string& rhs);//使⽤⽅式:s1 > s2
bool operator> (const char* lhs, const string& rhs);//使⽤⽅式:s3 > s1
bool operator> (const string& lhs, const char* rhs);//使⽤⽅式:s1 > s3
(6) s1 >= s2
bool operator>= (const string& lhs, const string& rhs);//使⽤⽅式:s1 >= s2
bool operator>= (const char* lhs, const string& rhs);//使⽤⽅式:s3 >= s1
bool operator>= (const string& lhs, const char* rhs);//使⽤⽅式:s1 >= s3
上述的关系运算符的重载看着复杂,但是使用起来是非常简单的。
关于操作符的重载,只有深入学习C++的类和对象,才能深入理解和掌握,在竞赛中不需要深入挖掘,会使用就行,但是要使用C++进行工程性开发的时候这部分知识一定要补上。
注:字符串的比较是基于字典序进行的,比较是对应位置上字符的ASCII值的大小;比较的不是字符串的长度。
比如
"abc" < "aq" //'b'的ascii码值是⼩于'q'的
"abcdef" < "ff" //'a'的ASCII码值是⼩于'f'的
"100" < "9" //'1'的ASCII码值是⼩于'9'的
代码举例1:
#include <iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello world";string s2 = "hello";if (s1 == (s2 + " world")) {cout << "s1 == s2" << endl;}else{cout << "s1 != s2" << endl;}return 0;
}
代码举例2:
#include <iostream>
#include <string> 
using namespace std;
int main()
{string s1 = "abcd";string s2 = "abbcdef";char s3[] = "bbc";if (s1 > s2)cout << "s1 > s2" << endl;elsecout << "s1 <= s2" << endl;if (s1 == s2)cout << "s1 == s2" << endl;elsecout << "s1 != s2" << endl;if (s1 <= s3)cout << "s1 <= s3" << endl;elsecout << "s1 > s3" << endl;return 0;
}
12.和string相关的函数
(1)stoi/stol
stoi 是将字符串转换成 int 类型的值
stol 是将字符串转换成 lon g int 类型的值
这里以 stoi 为例讲解一下这两函数的使用方式。
stoi 函数其实可以将一个 string 类型的字符串,转化为整型,函数原型如下:
int stoi (const string& str, size_t* idx = 0, int base = 10);
long stol (const string& str, size_t* idx = 0, int base = 10);
str 表示被转换的 string 类型的字符串
idx 是一个输出型参数,也就是这个通过这个参数会带回一个值。 idx 是一个指针,需要在外边创建一个 size_t 类型的值,传递它的地址给 idx ,这个参数将会带回 str 中无法正确匹配数字的第一个字符的位置。如果不想使用这个参数,可以将这个参数设为NULL或0。
base 表示被解析的字符串中数字的进制值,可能是 2 , 8 , 10 , 16 或者 0 。
默认情况下这个值是 10 ,表示  10 进制数字
如果传递的是 2 ,表示被解析的字符串中是 2 进制的数字,最终会转换成 10 进制
如果传递的是 8 ,表示被解析的字符串中是 8 进制的数字,最终会转换成 10 进制
如果传递的是 16 ,表示被解析的字符串中是 16 进制的数字,最终会转换成 10 进制
如果传递的是 0 ,会根据字符串的内容的信息自动推导进制,比如:字符串中有 0x ,就认为
16 进制, 0 开头会被认为是 8 进制,最终会转换成 10 进制。
代码举例:
#include <iostream>
#include<string> 
using namespace std;
int main()
{size_t pos = 0;string s1 = "11x34";int ret1 = stoi(s1, &pos, 16);cout << ret1 << endl;cout << "pos:" << pos << endl;string s2 = "11x34";int ret2 = stoi(s2, &pos, 2);cout << ret2 << endl;cout << "pos:" << pos << endl;string s3 = "0x11x34";int ret3 = stoi(s3, &pos, 0);cout << ret3 << endl;cout << "pos:" << pos << endl;return 0;
}
(2)stod/stof
stod 是将字符串转换成 double 类型的值,函数原型如下,和 stoi 函数的比较的话,少了描述
字符串中数字进制的参数,其他参数一致。 stof 是将字符串转换成 flaot 类型的值。
double stod (const string& str, size_t* idx = 0);
float stof (const string& str, size_t* idx = 0);
代码举例:
#include <iostream>
#include<string> 
using namespace std;
int main()
{string s = "3.14x456";double ret = stod(s, NULL);cout << ret << endl;return 0;
}
(3)to_string
函数原型如下:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
tostring 函数可以将数字转换成字符串,从上述函数原型的角度看的话,可以将整型、浮点型的数
字转换成字符串的,使用起来也非常简单。
代码举例:
#include <iostream>
#include <string> 
using namespace std;
int main()
{string pi = "pi is " + to_string(3.14159);cout << pi << endl;return 0;
}

相关文章:

C++:string

一、string概念 之前介绍过通过字符数组保存字符串&#xff0c;然后对字符数组中的字符串做各种操作&#xff1b;为了更加简单方便&#xff0c;在C中&#xff0c;又增加了 string 来处理字符串。 char str[20] "hello world"; string 字符串其实是一种更加高级的封…...

用c实现C++类(八股)

在 C 语言中&#xff0c;虽然没有内建的面向对象编程&#xff08;OOP&#xff09;特性&#xff08;如封装、继承、多态&#xff09;&#xff0c;但通过一些编程技巧&#xff0c;我们仍然可以模拟实现这些概念。下面将用通俗易懂的方式&#xff0c;逐步介绍如何在 C 中实现封装、…...

一区10+!线粒体基因组+宏基因组,微生态研究跨界新组合

在自然界中&#xff0c;微生物与宿主之间的共生关系是生物多样性和生态系统功能的重要组成部分。这些相互作用不仅塑造了宿主的进化历程&#xff0c;而且对宿主的生存和适应性至关重要。然而&#xff0c;这些共生关系的进化动态和共生菌基因组的演变仍然是微生物生态学和进化生…...

基于Python编程语言的自动化渗透测试工具

摘 要 近些年来网络安全形势变得越来越严峻&#xff0c;全球数百万个政企遭遇过不同程度的网络攻击。渗透测试是一种对目标进行信息安全评估的方法&#xff0c;而目前该行业仍在存在着安全服务行业价格昂贵&#xff0c;安全人才缺口巨大&#xff0c;在渗透测试时步骤繁琐、效率…...

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…...

C++例程:使用I/O模拟IIC接口(6)

完整的STM32F405代码工程I2C驱动源代码跟踪 一&#xff09;myiic.c #include "myiic.h" #include "delay.h" #include "stm32f4xx_rcc.h" //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphCl…...

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…...

Mysql--基础篇--SQL(DDL,DML,窗口函数,CET,视图,存储过程,触发器等)

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系型数据库的标准语言。它允许用户定义、查询、更新和管理数据库中的数据。SQL是一种声明性语言&#xff0c;用户只需要指定想要执行的操作&#xff0c;而不需要详细说明如何…...

[Transformer] The Structure of GPT, Generative Pretrained Transformer

The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work...

【教程】Unity 本地化多语种 | Localization 工具组

开发平台&#xff1a;Unity 6.0 编程平台&#xff1a;Visual Studio 2022 编程语言&#xff1a;CSharp 6.0 工具包类&#xff1a;Localization   一、前言 本地化多语言类型是软件面向国际化所必须的功能项。Unity 在 2022 版本后推出 Localization 工具包&#xff0c;以降低…...

模式识别与机器学习

文章目录 考试题型零、简介1.自学内容(1)机器学习(2)机器学习和统计学中常见的流程(3)导数 vs 梯度(4)KL散度(5)凸优化问题 2.基本概念3.典型的机器学习系统4.前沿研究方向举例 一、逻辑回归1.线性回归2.逻辑回归3.随堂练习 二、贝叶斯学习基础1.贝叶斯公式2.贝叶斯决策3.分类器…...

鸿蒙面试 2025-01-10

写了鉴权工具&#xff0c;你在项目中申请了那些权限&#xff1f;&#xff08;常用权限&#xff09; 位置权限 &#xff1a; ohos.permission.LOCATION_IN_BACKGROUND&#xff1a;允许应用在后台访问位置信息。 ohos.permission.LOCATION&#xff1a;允许应用访问精确的位置信息…...

在vscode上

第一步 安装插件 &#xff08;1&#xff09;从菜单处打开vscode&#xff0c;之后点击左侧“拓展”&#xff0c;在搜索栏输入“platform”&#xff0c;安装这个插件。 注&#xff1a;安装过程可能会慢一点&#xff0c;可以尝试连接自己的热点 &#xff08;2&#xff09;安装完…...

用WebGPU实现现代Web3D渲染——突破传统性能瓶颈的解决方案

引言 随着Web技术的不断发展&#xff0c;Web3D应用的需求不断增加。从游戏引擎到可视化工具&#xff0c;3D渲染技术正在被广泛地应用。然而&#xff0c;传统WebGL技术在性能、效率和灵活性上仍存在局限性。而WebGPU作为一种新兴的Web标准&#xff0c;为现代3D渲染提供了强大而…...

HTML5 加载动画(Loading Animation)

加载动画&#xff08;Loading Animation&#xff09;详解 概述 加载动画是指在数据加载过程中&#xff0c;向用户展示的一种视觉效果&#xff0c;旨在提升用户体验&#xff0c;告知用户系统正在处理请求。它可以减少用户的等待焦虑感&#xff0c;提高界面的互动性。 常见的加…...

.NET AI 开发人员库 --AI Dev Gallery简单示例--问答机器人

资源及介绍接上篇 nuget引用以下组件 效果展示&#xff1a; 内存和cpu占有&#xff1a; 代码如下&#xff1a;路径换成自己的模型路径 模型请从上篇文尾下载 internal class Program{private static CancellationTokenSource? cts;private static IChatClient? model;privat…...

Linux 高级路由 —— 筑梦之路

Linux 高级路由详解 本文将基于您提供的 Linux 高级路由极简教程 文章&#xff0c;深入探讨 Linux 高级路由的概念、配置方法以及应用场景。 一、什么是 Linux 高级路由&#xff1f; Linux 高级路由是指利用 Linux 内核提供的强大网络功能&#xff0c;实现超越传统路由表和默…...

实习总结(经历篇)

自从读研后,有可能是看见同龄的财会专业的同学去各种大厂实习:B站,阿里等,身边也有舍友在有过小厂实习,所以一直有个想法就是去实习,这个想法终于在研一的暑假快开始前被我赋予行动。 研一暑假和同门一起在boss等招聘软件投简历,但是当时并没有很好的对简历做修改,投递…...

【ShuQiHere】pandas 与 DataFrame 全面详解

【ShuQiHere】 本文将为您系统介绍 pandas 与 DataFrame 之间的区别&#xff0c;着重讲解 DataFrame 的常用方法以及相关的数据可视化操作&#xff0c;包括 df.hist()、df.plot()、df.boxplot() 等。无论您是数据分析新手还是有经验的专业人士&#xff0c;都可以从本文中快速掌…...

【回眸】发财日记

积累本金&#xff0c;有舍有得。 上学时在线上兼职&#xff0c;基本够开销没攒下钱&#xff0c;上班之后工资还能攒下不少。 对于花销要有舍有得。认同一句话“买东西要买能力范围内最好的”。 所以&#xff0c;每次花钱前都会思考: 是否需要&#xff0c;是否能替代已有产品&…...

文件读写到SQLite数据库的方法

在 SQLite 数据库中&#xff0c;将文件读写到数据库的常见方法主要有以下几种&#xff1a; 1. 将文件以 BLOB 类型存储 BLOB&#xff08;Binary Large Object&#xff09; 是 SQLite 中的二进制数据类型&#xff0c;可以直接用来存储文件内容。 步骤&#xff1a; 创建表 创建一…...

基于SDN的ddos攻击检测与防御

本项目依赖mininet, floodlight, sFlow-RT 1&#xff0c;启动floodlight cd floodlightjava -jar target/floodlight.jar 浏览器访问http://localhost:8080/ui/pages/index.html 或者http://localhost:8080/ui/index.html 2&#xff0c;创建 mininet拓扑 sudo mn --toposingl…...

RocketMQ 和 Kafka 有什么区别?

目录 RocketMQ 是什么? RocketMQ 和 Kafka 的区别 在架构上做减法 简化协调节点 简化分区 Kafka 的底层存储 RocketMQ 的底层存储 简化备份模型 在功能上做加法 消息过滤 支持事务 加入延时队列 加入死信队列 消息回溯 总结 来源:面试官:RocketMQ 和 Kafka 有…...

关于人工智能学习框架

人工智能学习框架&#xff1a;智能时代的强大引擎 在人工智能蓬勃发展的今天&#xff0c;学习框架如同一座座坚实的桥梁&#xff0c;连接着理论与实践&#xff0c;承载着创新与突破&#xff0c;为智能科技的前行提供了强大动力。本文将深入剖析人工智能学习框架的重要意义、核…...

Android14上使用libgpiod[gpioinfo gpioget gpioset ...]

环境 $ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.5 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.5 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="…...

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用&#xff08;运行中的程序&#xff09;的角度。外部特指文件。 这里的文件是泛指&#xff0c;并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…...

TensorFlow Quantum快速编程(高级篇)

五、实战:量子分类器应用 5.1 数据准备 在实战构建量子分类器时,数据准备是基石环节。选用鸢尾花数据集,这一经典数据集在机器学习领域应用广泛,其涵盖了三种鸢尾花品种的样本,每个样本包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征。鉴于本次构建二分类量子分类…...

无人机+无人车:车机协同技术探索详解

无人机与无人车之间的协同技术是一种重要的研究方向&#xff0c;它结合了无人机的高空视野和无人车的地面移动能力&#xff0c;旨在实现更高效、灵活的作业。以下是对无人机与无人车车机协同技术的详细探索&#xff1a; 一、技术基础 1. 通信机制&#xff1a; 无人机与无人车…...

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本&#xff1a;woocommerce.9.5.1 WordPress在安装了WooCommerce插件后&#xff0c;安装的过程中没有问题&#xff0c;在安装完成后提示&#xff1a; 此站点遇到了致命错误&#xff0c;请查看您站点管理…...

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…...

【数据库】六、数据库设计

文章目录 六、数据库设计1 数据库设计步骤1.1 规划阶段1.2 需求分析1.3 概念设计阶段(重点)1.4 逻辑设计阶段(重点)1.5 物理设计阶段1.6 数据库的实现1.7 数据库运行与维护 2 概念模型设计2.1 ER模型2.1.1 ER模型的基本元素2.1.2 联系的设计2.1.3 采用ER模型的概念设计2.1.4 ER…...

错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中

一、问题 用maven对一个开源项目打包时&#xff0c;遇到了“错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。”&#xff1a; 二、原因 原因是当前java环境是Java 8&#xff08;版本52.0&#xff09;&#xff0c;但…...

不同音频振幅dBFS计算方法

1. 振幅的基本概念 振幅是描述音频信号强度的一个重要参数。它通常表示为信号的幅度值&#xff0c;幅度越大&#xff0c;声音听起来就越响。为了更好地理解和处理音频信号&#xff0c;通常会将振幅转换为分贝&#xff08;dB&#xff09;单位。分贝是一个对数单位&#xff0c;能…...

《探秘开源多模态神经网络模型:AI 新时代的万能钥匙》

《探秘开源多模态神经网络模型&#xff1a;AI 新时代的万能钥匙》 一、多模态模型的崛起之路&#xff08;一&#xff09;从单一到多元&#xff1a;模态的融合演进&#xff08;二&#xff09;关键技术突破&#xff1a;解锁多模态潜能 二、开源多模态模型深度剖析&#xff08;一&…...

计算机网络之---端口与套接字

总括 端口&#xff1a;是计算机上用于标识网络服务的数字标识符&#xff0c;用于区分不同的服务或应用程序。套接字&#xff1a;是操作系统提供的用于进程间网络通信的编程接口&#xff0c;允许程序通过它来进行数据的发送、接收和连接管理。关系&#xff1a;端口号用于标识服…...

el-tabs中tabs过多造成form表单输入的时候卡顿

这里写自定义目录标题 tabs过多造成的输入卡顿解决方案方案一方案二 出现的并发问题解决方案 tabs过多造成的输入卡顿 描述&#xff1a;前端要写一个需求&#xff0c;大概有一百多个tab渲染过来&#xff0c;每个tab中都是一个表单&#xff0c;这个时候数据渲染任务加重&#x…...

vue+vite打包空白问题

在使用vuevite创建项目之后如果我们在部署项目的时候使用的不是主域名 比如www.custom.com 而是使用了www.custom.com/test 为访问域名的时候 如果不小心没有注意到这个变化 在打包上线之后会出现页面空白 js或者css404问题 我们可以在vite.config.ts去配置路径base export de…...

【python翻译软件V1.0】

如果不想使用密钥的形式&#xff0c;且需要一个直接可用的中英文翻译功能&#xff0c;可以使用一些免费的公共 API&#xff0c;如 opencc 或其他无需密钥的库&#xff0c;或直接用 requests 获取翻译结果。 其中&#xff0c;我可以给你一个简单的代码示例&#xff0c;使用 tra…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

实战训练1—求最大公约数 问题描述&#xff1a; 给定两个正整数&#xff0c;求它们的最大公约数。 输入格式&#xff1a; 输入一行&#xff0c;包含两个正整数。 输出格式&#xff1a; 输出一行&#xff0c;包含gcd正整数&#xff0c;即这两个正整数的最大公约数。 输入…...

HTTPS协议的基础与工作原理

什么是HTTPS&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c;它通过SSL/TLS协议对通信数据进行加密&#xff0c;确保数据的安全传输。与HTTP相比&#xff0c;HTTPS能防止数据被窃取、篡改或伪造&#xff0c;广…...

手游业务该如何选择服务器?

在网络游戏行业当中&#xff0c;对于服务器配置的需求是非常高的&#xff0c;大型的网络游戏需要服务器的高稳定性&#xff0c;来保证用户的游戏体验感&#xff0c;那么对于手游业务来说该如何进行选择服务器呢&#xff1f; 手游业务通常都需要处理大量的用户数据信息和并发请求…...

Python 数据建模完整流程指南

在数据科学和机器学习中&#xff0c;建模是一个至关重要的过程。通过有效的数据建模&#xff0c;我们能够从原始数据中提取有用的洞察&#xff0c;并为预测或分类任务提供支持。在本篇博客中&#xff0c;我们将通过 Python 展示数据建模的完整流程&#xff0c;包括数据准备、建…...

java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

今天在朋友机子上运行代码&#xff0c;在生成token的时候&#xff0c;遇到了这样一个问题&#xff1a; Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.…...

12. C语言 数组与指针(深入理解)

本章目录: 前言1. 什么是数组&#xff1f;2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...

C#用直线和曲线抗锯齿

使用 GDI 绘制一条线时&#xff0c;要提供线条的起点和终点&#xff0c;但不必提供有关线条上各个像素的任何信息。 GDI 与显示驱动程序软件协同工作&#xff0c;确定将打开哪些像素以在特定显示设备上显示该线条。 效果对比 代码实现 关键代码 e.Graphics.SmoothingMode Sm…...

从SS到CSS:探索网页样式设计的奥秘

一、什么是CSS CSS&#xff0c;全称为层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述HTML&#xff08;超文本标记语言&#xff09;或XML&#xff08;包括如SVG、MathML等各种XML方言&#xff09;文档样式的样式表语言。 从结构和功能的…...

[Git] git reset --hard / git reset --soft

git reset --hard 功能&#xff1a;重置索引&#xff08;暂存区&#xff09;和工作目录到指定的提交状态。这意味着它会丢弃所有未提交的更改和已暂存的更改。 适用场景&#xff1a;当你想要完全放弃当前工作目录中的所有更改并回退到某个特定提交状态时&#xff0c;可以使用这…...

OIDC IdentityServer4》》授权码模式+刷新令牌

认证服务 new Client {ProtocolType "oidc",ClientName "测试",ClientId "zen",//定义客户端 Id 要唯一ClientSecrets { new Secret("abc123zenabres89jijkomnlj".Sha256()) },//Client用来获取token// 混合模式AllowedGrantTyp…...

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…...

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板&#xff0c;输入Go: Install/Update Tools&#xff0c;并单击该命令执行&#xff0c;安装或更新Go语…...