C++ string的精讲

个人主页:Jason_from_China-CSDN博客

所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客

所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客

前言

  1. string是标准库中的一个类,它位于<string>头文件中。
  2. 这个类提供了很多方便的功能来处理字符串,比如字符串的拼接、查找、替换等操作。提高了字符串处理的安全性、便捷性和效率,使得 C++ 在文本处理等领域更具优势。
  3. 这里作为string作为C++优先出现的一个标准库里面的类,促进了C++的进步,但是在接口上面也有点冗余
  4. 在学习的时候,尽量打开C++的string英语文档,对比学习,这样效率高一点
  5. 这里是学习C++第一个类,所以这里我会尽量一个一个讲解,详细的深入剖析,会根据网站里的string的类的流程进行讲解,也会讲解如何看C++的英语文档
    string - C++ Reference (cplusplus.com)icon-default.png?t=O83Ahttps://legacy.cplusplus.com/reference/string/string/?kw=string
  6. 这一篇章其实是没有什么难度的,只要你学过数据结构,没有学习过数据结构会有一些难度,我会建议先学习数据结构,再学习C++方向,当然不学习也是没有问题的
    数据结构系统性学习_Jason_from_China的博客-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/jason_from_china/category_12634899.html
  7. 这里我的讲解思路会从,string的成员函数,迭代器,判空,字符串操作,元素访问,以及string的模拟实现来进行讲解分析
  8. C/C++官方文档查询:
    cppreference.comicon-default.png?t=O83Ahttps://en.cppreference.com/w/
  9. C/C++cplusplus文档查询(我自己经常使用文档查询网站):
    cppreference.comicon-default.png?t=O83Ahttps://en.cppreference.com/w/这个网站是最新的,我喜欢看旧版的搜索,所以可以点击右上角的【Lefacy version】

文档查询的和使用阅读

网站:

这里我们使用C/C++cplusplus文档查询(我自己经常使用文档查询网站):

cplusplus.com/reference/cstdio/icon-default.png?t=O83Ahttps://cplusplus.com/reference/cstdio/

页面查询流程:

新版页面(这里是不能查询的,所以我们可以去老版的页面去查询):


 

进入老版的使用页面(我们可以进行查询我们需要学习的类):可以看到这里是可以搜索的


 

搜索string:此时我们进入搜索的页面了

网站查询介绍

对于C++的文档的学习,其实还是建议去直接看英文,直接翻译的话会导致不准确,不精确

从这里我们可以看出来,如果你直接进行翻译的话,就会导致翻译不准确的存在

布局详解

这里我们直接点击进入第一个

可以看见里面有内容的详细介绍

总结:

  1. 从上述网站的介绍我们可以发现,其实类的学习大部分的时候 需要自己查阅文档的
  2. 要观看博客,学习类
    重点是:前期在博客上面学会查阅文档
               :系统的学习一两个类,并且去实现一两个类,把其中的一些小点学会

string必须掌握的

string因为是C++实现比较靠前的类,所以实现的接口很多都是复杂冗余的,真正需要掌握的其实只有那二十几个,不看文档也得会的,这里也会重点讲解,其他的我也会讲解,只是会稍微的带一带,不会那么精细

Member functions (成员函数)

(constructor):构造函数

语法结构解析:

七大语法结构解析:

default (1)
string();
//构造

copy (2)
string (const string& str);
//拷贝构造

substring (3)
string (const string& str, size_t pos, size_t len = npos);
//拷贝str的字符串,从pos开始,长度为len

from c-string (4)
string (const char* s);
//直接拷贝整个字符串

from sequence (5)
string (const char* s, size_t n);
//拷贝字符串,从第n个字符串开始,直到结束

fill (6)
string (size_t n, char c);
//指定字符进行构造

range (7)
template <class InputIterator>
  string  (InputIterator first, InputIterator last);
//使用迭代器来构造字符串
//注意:下面就会讲解迭代器,所以这里先做了解

(destructor):析构函数

析构函数这里会自动调用的

operator=:赋值

string (1)
string& operator= (const string& str);
//赋值字符串

c-string (2)
string& operator= (const char* s);
//赋值字符

character (3)
string& operator= (char c);
//赋值字符

Iterators(迭代器)

前言

string的迭代器也称之为遍历,遍历的方式主要有三种:

  1. 迭代器
  2. 下标实现【】
  3. 范围for

operator[]:元素访问【】

 可以读写(1)
char& operator[] (size_t pos);
//元素访问

 可读不可写(2)
const char& operator[] (size_t pos) const;
//元素访问

迭代器(Iterators

语法结构的实现:

这里的意思是当遇见最后的数值的时候,就会停止,end(),指向最后的数值

代码

	//迭代器
	std::string b3("Hello word 03");
	string::iterator it1 = b3.begin();
	while (it1 != b3.end())
	{
		cout << *it1;
		++it1;
	}
	printf("\n\n\n");

list(容器)+迭代器

迭代器的主要作用就是与容器结合使用,以提供一种统一的方式来访问容器中的元素。不同的容器可能有不同类型的迭代器,但它们都遵循一些共同的规则和行为。

	//list+迭代器的使用
	list<int> it2;
	it2.push_back(1);
	it2.push_back(2);
	it2.push_back(3);
	it2.push_back(4);
	list<int>::iterator it3 = it2.begin();
	while (it3 != it2.end())
	{
		cout << *it3;
		++it3;
	}
	printf("\n\n\n");

范围for(智能遍历)

auto(语法糖)

学习范围for需要学习自动匹配auto,所以我们需要学习一下auto,也就是我们常说的语法糖,因为很甜,用起来很方便,所以叫做语法糖

语法结构讲解:

实现

代码实现:

从代码这里我们可以看出来,auto本质就是自动匹配类型,接下来我们会把auto和范围for进行结合使用

	//auto语法糖
	//auto简单的自动匹配
	auto bb1 = 1;
	auto bb2 = 1.1;
	auto bb3 = 0.1;
	auto bb4 = 1 / 10;
	cout << bb1 <<endl
		<< bb2 << endl
		<< bb3 << endl 
		<< bb4 << endl
		<< endl << endl;

	//容器的自动匹配
	list<int> it4;
	it4.push_back(1);
	it4.push_back(2);
	it4.push_back(3);
	it4.push_back(4);
	//list<int>::iterator it4 = it2.begin();
	auto it5 = it4.begin();
	while (it5 != it4.end())
	{
		cout << *it5;
		++it5;
	}
	printf("\n\n\n");


范围for(智能遍历)

语法讲解:
for(auto e(变量名):str(指向的字符串进行遍历))
{
    //对变量名进行操作
}

实现讲解

代码
	//范围for
	for (auto ch1 : it4)
	{
		cout << ch1;
	}
	printf("\n\n\n");
	for (auto ch2 : it4)
	{
		ch2 = 1;
		cout << ch2;
	}
	printf("\n\n\n");
	for (auto ch3 : it4)
	{
		ch3++;
		cout << ch3;
	}
	printf("\n\n\n");
范围for使用的限制(C++11之后才出现的范围for):

修改编译器的标准

auto是C++11开始支持的,C++20支持做参数的,所以我们需要学会修改编译器的标准

begin+end正向迭代

这里本质上就是迭代器的开始和结束,所以不做过多赘述,上面已经开始讲解了

rbegin+rend反向迭代

反向迭代和正向迭代刚好是相反的

其他的都是一样的

	//反向迭代器
	string c1("Hello word");
	string::reverse_iterator cc1 = c1.rbegin();
	while (cc1 != c1.rend())
	{
		cout << *cc1 << " ";
		++cc1;
	}

const修饰和不修饰

const修饰就会

  

  

	//const修饰和不修饰的问题
	const string c2("Hello word");
	//string::const_iterator cc2 = c1.begin();
	auto cc2 = c1.begin();
	while (cc2 != c1.end())
	{
		cout << *cc2 << " ";
		++cc2;
	}
	printf("\n\n\n");
	//string::const_reverse_iterator ccc2 = c1.rbegin();
	auto ccc2 = c1.rbegin();
	while (ccc2 != c1.rend())
	{
		cout << *ccc2 << " ";
		++ccc2;
	}
	printf("\n\n\n");
	for (auto ch : c2)
	{
		cout << ch << " ";
		++ch;
	}

C++11

Capacity(容量)

前言

这里直接翻译过来的意思是容器的意思,也可以这样理解,但是是不完全正确的,因为这里更多的是计算容器里面字符的长度,以及容器的大小,还有是否是空,所以还是那句话,还是需要读英文文献

size+length(字符串长度)

这里有些是比较简单的,那么我就会图解直接带过

这两个都是计算长度的,但是还是比较推荐size,因为size很多类和库里面都有,因为C++语言发展的原因,所以size兼容性会更好,使用的更广,所以这里推荐使用size

max_size (容器的最大数量)

作用是返回容器所能容纳的元素的最大数量。

resize(扩容缩容,指定字符扩容)

 (1)
void resize (size_t n);
//扩容,缩容

 (2)
void resize (size_t n, char c);
//指定字符进行扩容

	string d1("Hello word");
	d1.resize(20);
	d1.resize(2);
	d1.resize(30,'1');

capacity

	string d1("Hello word");
	d1.resize(20);
	d1.resize(2);
	d1.resize(30,'1');
	cout << d1.capacity();
	printf("\n\n\n");

reserve(扩容(不改变字符数量))

	string d1("Hello word");
	d1.resize(20);
	d1.resize(2);
	d1.resize(30,'1');
	cout << d1.capacity();
	d1.reserve(200);
	printf("\n\n\n");

clear(清除数据)

	string d1("Hello word");
	d1.resize(20);
	d1.resize(2);
	d1.resize(30,'1');
	cout << d1.capacity();
	d1.reserve(200);
	d1.clear();
	printf("\n\n\n");

empty(判空)

C++11

Element access(获取需要的字符)

operator[] (下标访问)

(3)
char& operator[] (size_t pos);

(3)
const char& operator[] (size_t pos) const;

报错是断言处理

 at

 (1)
char& at (size_t pos);
 (2)
const char& at (size_t pos) const;

//同理,只是加上const

	string d1("Hello word");
	d1.resize(20);
	d1.resize(2);
	d1.resize(30,'1');
	cout << d1.capacity();
	d1.reserve(200);
	d1.clear();
	printf("\n\n\n");

	越界访问
	//d1[2000];
	try
	{
		d1.at(1000);

	}
	catch (const std::exception& e)
	{
		cout << e.what() << endl;
	}

back +front 

Modifiers(插入,赋值,交换)

前言

operator+=

string (1)
string& operator+= (const string& str);

c-string (2)
string& operator+= (const char* s);

character (3)
string& operator+= (char c);

	string e2("Hello word");
	cout << e2.back();
	cout << e2.front();
	printf("\n\n\n");

	string f1("Hello word");
	f1 += 'K';
	cout << f1 << endl;
	
	f1 += " ehfaso ";
	cout << f1 << endl;

	f1 += e2;
	cout << f1 << endl;

append (追加字符串)

这个虽然多,但是不是必须要掌握的

string (1)
string& append (const string& str);
//

substring (2)
string& append (const string& str, size_t subpos, size_t sublen);
//追加哪一个字符串,从第几个开始,追加长度

c-string (3)
string& append (const char* s);
//追加字符串

buffer (4)
string& append (const char* s, size_t n);
//追加哪一个字符串,从第几个开始,会直接到结束

fill (5)
string& append (size_t n, char c);
//追加指定个数的字符

range (6)
template <class InputIterator>
   string& append (InputIterator first, InputIterator last);
//迭代器的实现

push_back (尾插)+pop_back (尾删)

assign (拷贝,可以指定,覆盖)

	//assign的实现
	string h1("hello word ");
	string h2("BU HELLOW WORD ");
	//拷贝字符串
	h1.assign(h2);
	cout << h1 << endl;

	//拷贝一定的长度
	h1.assign(h2, 3, 6);
	cout << h1 << endl;

	//拷贝字符串
	h1.assign(h2);
	cout << h1 << endl;

	//从第四个开始,一直到结束
	h1.assign(h2, 4);
	cout << h1 << endl;

	//拷贝字符,n个
	h1.assign(10, '4');
	cout << h1 << endl;

	//迭代器的实现
	h1.assign(h2.begin() + 6, h2.end() - 2);
	cout << h1 << endl;
	printf("\n\n\n");
string (1)
string& assign (const string& str);
//拷贝字符串

substring (2)
string& assign (const string& str, size_t subpos, size_t sublen);
//拷贝一定的长度

c-string (3)
string& assign (const char* s);
//拷贝字符串

buffer (4)
string& assign (const char* s, size_t n);
//拷贝哪一个字符串,从第几个开始,一直到结束

fill (5)
string& assign (size_t n, char c);
//拷贝字符,n个

range (6)
template <class InputIterator>
   string& assign (InputIterator first, InputIterator last);
//迭代器

insert (指定位置插入)

string (1)
 string& insert (size_t pos, const string& str);
//指定位置插入

substring (2)
 string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
//从第几个开始插入,插入字符串str,长度是哪一个开始,这个字符串一共插入多长

c-string (3)
 string& insert (size_t pos, const char* s);
//指定位置插入字符串

buffer (4)
 string& insert (size_t pos, const char* s, size_t n);
//指定位置插入字符串,插入字符串的个数

fill (5)
 string& insert (size_t pos, size_t n, char c);
    void insert (iterator p, size_t n, char c);
//指定位置插入指定字符,可以插入指定个数

  

single character (6)
iterator insert (iterator p, char c);
//迭代器的方式选择插入的位置,插入一个字符

  

range (7)
template <class InputIterator>
   void insert (iterator p, InputIterator first, InputIterator last);
//迭代器的方式选择插入的位置,选择插入的长度

  

	//insert的使用
	string j1("hello word ");
	string j2("BU HELLOW WORD ");
	//指定位置插入
	j1.insert(2, j2);
	cout << j1 << endl;

	//从第0个开始插入,插入字符串j2,j2的长度是0个开始,15个
	j1.insert(0, j2, 0, 15);
	cout << j1 << endl;

	//从第几个位置开始插入数值
	j1.insert(0, j2);
	cout << j1 << endl;

	//指定位置插入字符串,插入字符串的个数
	j1.insert(0, j2, 1);
	cout << j1 << endl;

	//指定位置插入指定字符,可以插入指定个数
	j1.insert(0, 5, '1');
	cout << j1 << endl;

	//迭代器的方式选择插入的位置
	j1.insert(j1.begin(), '1');
	cout << j1 << endl;


	//迭代器的方式选择插入的位置,选择插入的长度
	j1.insert(j1.begin(), j1.begin(), j1.end());
	cout << j1 << endl;

erase(删除字符串)

sequence (1)
 string& erase (size_t pos = 0, size_t len = npos);
//从第几个位置开始删除几个字符
//注意删除字符是不改变空间容量大小的

character (2)
iterator erase (iterator p);
//迭代器删除一个下标

range (3)
     iterator erase (iterator first, iterator last);
//迭代器删除一个整个字符

	//erase
	string k1("hello word 1111111111111111111111111111111111111111");
	string k2("BU HELLOW WORD 1111111111111111111111111111111111111111");
	
	//从第几个位置开始删除几个字符
	cout << k1.capacity() << endl;
	k1.erase(5, 5);
	cout << k1 << endl;
	cout << k1.capacity() << endl;
	printf("\n\n\n");

	//迭代器删除一个下标
	cout << k2 << endl;
	k2.erase(k2.begin());
	cout << k2 << endl;
	printf("\n\n\n");

	//迭代器删除一个整个字符
	cout << k2 << endl;
	k2.erase(k2.begin(), k2.end());
	cout << k2 << endl;


	printf("\n\n\n");

replace(更换字符串)

string (1)
string& replace (size_t pos,  size_t len,  const string& str);
string& replace (iterator i1, iterator i2, const string& str);
//从第4个开始,一直到结束,这个区间替换为l2,不建议过多使用,因为设计扩容和后移的问题

//这里我们还可以从寻找到的开始,替换掉y1的长度为5的字符,替换为j

substring (2)
string& replace (size_t pos,  size_t len,  const string& str,
                 size_t subpos, size_t sublen);
//选择需要替换的字符串长度,选择长度

c-string (3)
string& replace (size_t pos,  size_t len,  const char* s);
string& replace (iterator i1, iterator i2, const char* s);
//选择指定长度,替换为你需要的字符串

buffer (4)
string& replace (size_t pos,  size_t len,  const char* s, size_t n);
string& replace (iterator i1, iterator i2, const char* s, size_t n);
//这里指定更改字符串

fill (5)
string& replace (size_t pos,  size_t len,  size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
//更换指定位置的字符

range (6)
template <class InputIterator>
  string& replace (iterator i1, iterator i2,
                   InputIterator first, InputIterator last);
//迭代器的实现更换

	//replace
	//从第4个开始,一直到结束,这个区间替换为l2,不建议过多使用,因为设计扩容和后移的问题
	string l1("1111111111111111111111111111111111111111 ");
	string l2("2222222222222222222222222222222222222222 ");
	l1.replace(4, l1.size(), l2);
	cout << l1 << endl;
	printf("\n\n\n");

	//区间直接进行替换
	string l3("1111111111111111111111111111111111111111 ");
	string l4("hhhhhhhhh ");
	l3.replace(l3.begin(), l3.end(), l4);
	cout << l3 << endl;
	printf("\n\n\n");

	//选择需要替换的字符串长度,选择长度
	//l5的全部字符串,替换为l6字符串的前五个字符串
	string l5("1111111111111111111111111111111111111111 ");
	string l6("hello word");
	l5.replace(0, l5.size(), l6, 0, 5);
	cout << l5 << endl;
	printf("\n\n\n");

	string l7("1111111111111111111111111111111111111111 ");
	string l8("hello word");
	l7.replace(0, l7.size(), "dsfdfs");
	cout << l7 << endl;
	printf("\n\n\n");

	string l9("1111111111111111111111111111111111111111 ");
	l9.replace(0, l9.size(), "hello", 2);
	cout << l9 << endl;
	printf("\n\n\n");

	//把从0开始的数值,更换为数值p
	string l11("1111111111111111111111111111111111111111 ");
	string l12("hello word");
	l11.replace(0, l11.size(), l11.size(), 'p');
	cout << l11 << endl;
	printf("\n\n\n");

	//利用迭代器实现更换
	string l13("1111111111111111111111111111111111111111 ");
	string l14("hello word");
	l13.replace(l13.begin(), l13.end(), l14.begin(), l14.end());
	cout << l13 << endl;

swap(交换)


	string i1("hello word ");
	string i2("BU HELLOW WORD ");
	i1.swap(i2);
	cout << i1 << endl;

String operations(兼容,替换,查找)

前言

这一篇章已经到最后一篇章了,所以难度会降低很多

c_str (兼容C语言)

这里存在的意义主要就是为了兼容C语言,因为C++不仅是面向对象的,而且还有很多C语言的接口,所以为了实现兼容C语言,所以出现了这样的,进行匹配

data(同理和C_str)

copy(拷贝)

把指定字符串放到数组里面,选择开始拷贝的位置

find(查找)+rfind(逆置查找)

查找一般是和替换一起使用的

也就是replace

find

string (1)
size_t find (const string& str, size_t pos = 0) const;

c-string (2)
size_t find (const char* s, size_t pos = 0) const;

buffer (3)
size_t find (const char* s, size_t pos, size_t n) const;

character (4)
size_t find (char c, size_t pos = 0) const;

	 //查找

	 std::string w1("hello word ");
	 std::string w2("hello word ");
	 size_t i = w1.find(' ');
	 while (i != string::npos)
	 {
		 w1.replace(i, 1, "$$");
		 i = w1.find(' ');
	 }
	 cout << w1;
	 printf("\n\n\n");
	 w1 = w2;

	 //这里需要新创建一个
	 std::string w3;
	 std::string w4(" hello word ");
	 for (auto ch : w4)
	 {
		 if (ch != ' ')
			 w3 += ch;
		 else
			 w3 += '*';
	 }
	 cout << w3;

rfind

string (1)
size_t rfind (const string& str, size_t pos = npos) const;

c-string (2)
size_t rfind (const char* s, size_t pos = npos) const;

buffer (3)
size_t rfind (const char* s, size_t pos, size_t n) const;

character (4)
size_t rfind (char c, size_t pos = npos) const;

find_first_of(替换)+find_last_of(替换)

find_first_not_of(不替换)find_last_not_of(不替换)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python算法——链表(反转链表,合并两个排序链表,判断是否有环,链表中倒数最后k个结点,第一个公共结点,删除重复元素)

哈喽大家好&#xff0c;好久不见&#xff01;又进入新的一个学期&#xff0c;这学期小编要进行python的算法学习啦&#xff0c;今天更新链表的部分题目~ 牛客 NC78 反转链表 题目如下&#xff1a; 算法思想如下&#xff1a; 1.初始化两个指针pre和cur&#xff0c;分别表示前驱…

ERROR [internal] load metadata for docker.io/library/nginx:latest

docker执行错误解决方法 1、执行docker pull nginx2、docker build -t xxx:xx

Ai环境安装教程

依赖的驱动软件 python3.115cuda11.4torch2.0.1 一。如何下载安装 一、驱动下载 【Python链接】https://www.python.org/ftp/python/3.11.5/python-3.11.5-amd64.exe 【CUDA链接】https://developer.download.nvidia.com/compute/cuda/11.4.4/local_installers/cuda_11.4.4…

从 Microsoft 官网下载 Windows 10

方法一&#xff1a; 打开 Microsoft 官网&#xff1a; 打开开发人员工具&#xff08;按 F12 或右键点击“检查”&#xff09;。 点击“电脑模拟手机”按钮&#xff0c;即下图&#xff1a; 点击后重新加载此网页&#xff0c;即可看到下载选项。

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…

Notepad++将搜索内容所在行选中,并进行复制等操作

背景 Notepad在非常多的数据行内容中&#xff0c;按照指定内容检索&#xff0c;并定位到具体行&#xff0c;而后对内容行的数据进行复制、剪切、删除等处理动作。 操作说明 检索并标记所在行 弹出搜索框&#xff1a;按下 Ctrl F。 输入查找字符串&#xff1a;在搜索框中输入要…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

java项目之精准扶贫管理系统源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的精准扶贫管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 精准扶贫管理系统的主要…

STM32重拾+找工作MD

1.工程文件创建 外部的文件夹要和工程文件对应&#xff0c;也就是外面创建好之后&#xff0c;里面也要对应添加&#xff1b; 首先是startup启动文件&#xff0c;这个是程序执行最基本的文件&#xff0c;keil中启动文件是用汇编写的&#xff0c;启动文件内定义了中断向量表&…

Java面试指南:Java基础介绍

这是《Java面试指南》系列的第1篇&#xff0c;本篇主要是介绍Java的一些基础内容&#xff1a; 1、Java语言的起源 2、Java EE、Java SE、Java ME介绍 3、Java语言的特点 4、Java和C的区别和联系&#xff1f; 5、面向对象和面向过程的比较 6、Java面向对象的三大特性&#xff1a…

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv&#xff01; 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级&#xff01;服务详情可以在官网查看详细解读&#xff01; 那些因为老旧版本而被攻击的例子 话不多说&#xff0c;直接上图&a…

QT实现校园导航

导航是地图类项目实战中经常会遇到了。看上去貌似没头绪&#xff0c;其实是有模板遵循的。我们直接根据图看代码。 //MainWidget.h#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include "mapwidget.h" #include <QToolButton> #in…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…

【动手学深度学习】7.3 网络中的网络(NiN)(个人向笔记)

LeNet&#xff0c;AlexNet和VGG都有一个共同的设计模型&#xff1a;通过一系列卷积层和汇聚层来提取空间结构特征&#xff0c;然后通过全连接层对特征的表征进行处理AlexNet和VGG对LeNet的改进主要是在于如何扩大和加深这两个模块网络中的网络(NIN)提出了&#xff1a;在每个像素…

视频云存储/音视频流媒体视频平台EasyCVR视频汇聚平台在欧拉系统中启动失败是什么原因?

视频监控/视频集中存储/磁盘阵列EasyCVR视频汇聚平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xff0c;这为其在各种复杂环境下的部署提供了便利。 安防监控EasyCVR视频汇聚平…

【含开题报告+文档+PPT+源码】贫困儿童一对一扶贫帮扶系统设计与实现

开题报告 根据《中华人民共和国慈善法》第五十八条规定&#xff0c;慈善组织确定慈善受益人&#xff0c;应当坚持公开、公平、公正的原则&#xff0c;不得指定慈善组织管理人员的利害关系人作为受益人[2]。以上所列举的平台基本没有做到公开、公平、公正的原则&#xff0c;例如…

OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面&#xff0c;通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…

大模型常见算子定义

本文将汇总大模型常用的算子定义&#xff0c;方便快速根据定义公式评估其计算量。 LayerNorm 这是在BERT、GPT等模型中广泛使用的LayerNorm&#xff1a; RMSNorm RMSNorm(root mean square)发现LayerNorm的中心偏移没什么用(减去均值等操作)。将其去掉之后&#xff0c;效果几乎…

如何将LiDAR坐标系下的3D点投影到相机2D图像上

将激光雷达点云投影到相机图像上做数据层的前融合&#xff0c;或者把激光雷达坐标系下标注的物体点云的3d bbox投影到相机图像上画出来&#xff0c;都需要做点云3D点坐标到图像像素坐标的转换计算&#xff0c;也就是LiDAR 3D坐标转像素坐标。 看了网上一些文章都存在有错误或者…

【Maven】一篇带你了解Maven项目管理工具

目录 项目管理工具Maven初识Maven什么是Maven为什么使用MavenMaven功能什么是项目构建什么是依赖管理Maven应用场景Maven项目结构Maven特点Maven模型 Maven安装安装准备Maven安装目录分析环境变量配置 创建Maven项目通过IDEA创建手动创建手动引入依赖 配置Maven仓库Maven仓库概…