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

【C++游记】string的使用和模拟实现

 

枫の个人主页

你不能改变过去,但你可以改变未来

算法/C++/数据结构/C

Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C++的内容呀。C++是接近底层有比较经典的语言,因此学习起来注定枯燥无味,西游记大家都看过吧~,我希望能带着大家一起跨过九九八十一难,降伏各类难题,学会C++,我会尽我所能,以通俗易懂、幽默风趣的方式带给大家形象生动的知识,也希望大家遇到困难不退缩,遇到难题不放弃,学习师徒四人的精神!!!故此得名【C++游记】

 话不多说,让我们一起进入今天的学习吧~~~ 

目录

1>>标准库的String

1.1>>auto和范围for小知识

1.2>>string常用接口(组件)这里都可以查找到

容量接口

访问和遍历

 string类对象的修改操作

非成员函数但会用到 

2>>string的模拟实现

 3>>Boos战——string重要接口的模拟实现

1.String.h

2.String.cpp 

3.wctest.cpp

4>>结语


1>>标准库的String

1.1>>auto和范围for小知识

师傅别怕,赠与“武器”一把 i

auto基本知识:

它声明引用类型时,必须在auto后加上&。

声明多个变量时,这些变量必须是相同的类型。

auto不能作为函数参数,可以作为返回值。

不能用于声明数组。

#include<iostream>
using namespace std;
int main() {auto a = 10;auto b = 'b';auto c = "asdofih";auto d = 11.11;auto& e = a;cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;cout << e << endl;printf("%p %p", &a, &e);return 0;
}

范围for:

        对比C语言的for循环,C++使用更好用的范围for代替, 格式为:“for(auto  范围内用于迭代的变量 : 被迭代的范围)”,自动迭代、取数据、结束,这就是自动范围for。

#include<iostream>
using namespace std;
int main() {int arr[] = { 1,2,3,4,5 };for (auto& e : arr) {//若要更改里面的数值,那么就要用引用才能修改到数组本身e += 2;}for (auto e : arr) {cout << e << " ";}cout << endl;string str("hello world");for (auto ch : str) {cout << ch << " ";}cout << endl;return 0;
}

1.2>>string常用接口(组件)这里都可以查找到

师傅后面都会介绍,不必担心

String函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char* s)用C-string(常量字符串)来构造string类对象
string(size_t n,char c)

string类对象中包含n个字符c

string(const string&s)

拷贝构造函数
void Test1() {string s1;//构造空的string类对象string s2("hello feng");//用常量字符串构造string类对象string s3(s2);//用s2拷贝构造s3
}

容量接口

若定义为string s,以下表size为例,就是s.size();

size返回字符串有效字符长度,使用范围比length广
length返回字符串有效字符长度
capacity返回总空间大小
empty检测字符串释放为空串,空返回true,非空返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符个数设置为n个,多余用c填充

补充说明:size和length的区别只有在引入迭代器才能体现出来,一般都用size,length有使用限制。

clear只清空,不改大小

resize(size_t n,char c)用变量c的字符填充多余空间,resize(size_t)则是用0来填充。

reserve预留空间,小于string的空间大小时不作改动。

访问和遍历

函数名称功能说明
operator[]返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器
rbegin+rendrbegin获取最后一个字符的迭代器+rend获取一个字符的迭代器
范围forC++11的遍历方式

 string类对象的修改操作

函数名称

功能说明

push_back在字符串后尾插字符c(单个)
append在字符串后追加一个字符串(多个)
operator+=在字符串后追加一个字符串(多个)
c_str返回C格式字符串
find+npos从字符串pos位置往后查找字符c,返回它的位置
rfind从字符串pos位置往前查找字符c,返回它的位置
substr在str中从pos位置开始,截取n个字符,将其返回

非成员函数但会用到 

函数       功能说明       
operator+深拷贝,效率低
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较

2>>string的模拟实现

错误示范:

#include<iostream>
#include<assert.h>
using namespace std;
class MyString {
public:MyString(const char* str = "") {if (str == nullptr) {perror("flase");return;}_str = new char[strlen(str) + 1];//加1放\0strcpy(_str, str);}~MyString() {if (_str) {delete[] _str;_str = nullptr;}}
private:char* _str;
};
void Test2() {string s1("hello feng");string s2(s1);
}int main() {/*Test1();*/Test2();return 0;
}

上述过程会报错,因为没有写拷贝构造,s2会调用s1的默认构造,而在类和对象章节中我们知道默认构造都是浅拷贝,这里是一个字符数组,因此要调用深拷贝。

#include<iostream>
#include<assert.h>
using namespace std;
class MyString {
public:MyString(const char* str = "") {//构造if (str == nullptr) {perror("flase");return;}_str = new char[strlen(str) + 1];//加1放\0strcpy(_str, str);}MyString(const MyString& s)//拷贝构造:_str(nullptr){MyString tmp(s._str);swap(tmp._str, _str);}~MyString() {//析构if (_str) {delete[] _str;_str = nullptr;}}
private:char* _str;
};
void Test2() {string s1("hello feng");string s2(s1);
}int main() {/*Test1();*/Test2();return 0;
}

 3>>Boos战——string重要接口的模拟实现

这里直接附上上个文件源码,大部分已经注释完毕,请大家伙享用,感兴趣可以复制过去测试,不过还是自己敲一遍比较好。

1.String.h

#pragma once#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;namespace wc
{class string{public:typedef char* iterator;//手动自造迭代器,名字与库中相同,但在wc的命名空间里typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}void swap(string& s);//交换,直接套用标准库里的swapstring(size_t n, char ch);//设置相同字符多少个为一个字符串string(const char* str = "");//构造函数string(const string& s);//拷贝构造函数~string();//析构函数void clear()//清除{_str[0] = '\0';_size = 0;}string& operator=(string s);//string& operator=(const string& s);const char* c_str() const//常数直接返回自己地址,比较快因此调用内联{return _str;}void reserve(size_t n);//保存,为字符串预留空间void push_back(char ch);//类似于尾插void append(const char* str);//尾插一个字符串string& operator+=(char ch);//类似于尾插string& operator+=(const char* str);//尾插一个字符串void insert(size_t pos, size_t n, char ch);//在pos位置插入n个ch字符void insert(size_t pos, const char* str);//在pos位置插入一个字符串void erase(size_t pos = 0, size_t len = npos);//在pos位置删除len个字符size_t find(char ch, size_t pos = 0);size_t find(const char* str, size_t pos = 0);size_t size() const{return _size;}size_t capacity() const{return _size;}char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}string substr(size_t pos, size_t len = npos);//从pos位置开始取len个作为子串返回bool operator==(const string& s) const;bool operator!=(const string& s) const;bool operator<(const string& s) const;bool operator<=(const string& s) const;bool operator>(const string& s) const;bool operator>=(const string& s) const;private:char* _str = nullptr;//定义字符串数组_strsize_t _size = 0;//有效个数size_t _capacity = 0;//总容量const static size_t npos;//设置默认结束值};// cout<<s1ostream& operator<<(ostream& out, const string& s);// cin>>s1istream& operator>>(istream& in, string& s);istream& getline(istream& is, string& s, char delim = '\n');void test_string1();void test_string2();void test_string3();void test_string4();void test_string5();void test_string6();void test_string7();
}

2.String.cpp 

//#include<iostream>
//using namespace std;
//int main() {
//	auto a = 10;
//	auto b = 'b';
//	auto c = "asdofih";
//	auto d = 11.11;
//	auto& e = a;
//	cout << a << endl;
//	cout << b << endl;
//	cout << c << endl;
//	cout << d << endl;
//	cout << e << endl;
//	printf("%p %p", &a, &e);
//	return 0;
//}
//#include<iostream>
//using namespace std;
//int main() {
//	int arr[] = { 1,2,3,4,5 };
//	for (auto& e : arr) {//若要更改里面的数值,那么就要用引用才能修改到数组本身
//		e += 2;
//	}
//	for (auto e : arr) {
//		cout << e << " ";
//	}
//	cout << endl;
//	string str("hello world");
//	for (auto ch : str) {
//		cout << ch << " ";
//	}
//	cout << endl;
//	return 0;
//}//void Test1() {
//	string s1;//构造空的string类对象
//	string s2("hello feng");//用常量字符串构造string类对象
//	string s3(s2);//用s2拷贝构造s3
//}
//#include<iostream>
//#include<assert.h>
//using namespace std;
//class MyString {
//public:
//	MyString(const char* str = "") {//构造
//		if (str == nullptr) {
//			perror("flase");
//			return;
//		}
//		_str = new char[strlen(str) + 1];//加1放\0
//		strcpy(_str, str);
//	}
//	MyString(const MyString& s)//拷贝构造
//		:_str(nullptr)
//	{
//		MyString tmp(s._str);
//		swap(tmp._str, _str);
//	}
//	~MyString() {//析构
//		if (_str) {
//			delete[] _str;
//			_str = nullptr;
//		}
//	}
//private:
//	char* _str;
//};
//void Test2() {
//	string s1("hello feng");
//	string s2(s1);
//}
//
//int main() {
//	/*Test1();*/
//	Test2();
//	return 0;
//}#define _CRT_SECURE_NO_WARNINGS 1
#include"string.h"namespace wc
{const size_t string::npos = -1;void string::swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}string::string(size_t n, char ch):_str(new char[n + 1]), _size(n),_capacity(n){for (size_t i = 0; i < n; i++) {_str[i] = ch;}_str[_size] = '\0';}string::string(const char* str)//声明中写过默认值,这里就不能再写了 :_size(strlen(str)){_capacity = _size;_str = new char[_size + 1];strcpy(_str, str);//复制还没复制\0_str[_size] = '\0';}string::string(const string& s){string tmp(s._str);swap(tmp);}string::~string(){delete[] _str;_str = nullptr;_size = 0;_capacity = 0;}string& string::operator=(string s) {swap(s);return *this;}void string::reserve(size_t n) {//预留空间if (n > _capacity) {//大于就扩容char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void string::push_back(char ch) {if (_size + 1 > _capacity) {//大于就扩容reserve(_capacity == 0 ? 4 : _capacity * 2);//预留空间刚写就能用}_str[_size] = ch;_size++;_str[_size] = '\0';}void string::append(const char* str) {size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}strcpy(_str + _size, str);_size += len;}string& string::operator+=(char ch){push_back(ch);return *this;}string& string::operator+=(const char* str){append(str);return *this;}void string::insert(size_t pos, size_t n, char ch){assert(pos <= _size);assert(n > 0);if (_size + n > _capacity){// 扩容size_t newCapacity = 2 * _capacity;if (_size + n > 2 * _capacity){newCapacity = _size + n;}reserve(newCapacity);}size_t end = _size + n;while (end > pos + n - 1) {_str[end] = _str[end - n];end--;}for (size_t i = 0; i < n; i++) {_str[pos + i] = ch;}_size += n;}void string::insert(size_t pos, const char* str){size_t n = strlen(str);insert(pos, n, 'x');//覆盖一下for (size_t i = 0; i < n; i++){_str[pos + i] = str[i];}}void string::erase(size_t pos, size_t len) {if (len > _size - pos) {//多删了_str[pos] = '\0';_size = pos;}else {size_t end = pos + len;while (end <= _size) {//\0也拷贝_str[end - len] = _str[end];end++;}_size -= len;}}size_t string::find(char ch, size_t pos){for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;}size_t string::find(const char* str, size_t pos){const char* p = strstr(_str + pos, str);if (p == nullptr){return npos;}else{return p - _str;}}string string::substr(size_t pos, size_t len){if (len > _size - pos)//若超出,就等于剩下长度len = _size - pos;string tmp;tmp.reserve(len);for (size_t i = 0; i < len; i++) {tmp += _str[pos + i];//直接加等,简单易懂}return tmp;}bool string::operator==(const string& s) const{return strcmp(_str, s._str) == 0;}bool string::operator!=(const string& s) const{return !(*this == s);}bool string::operator<(const string& s) const{return strcmp(_str, s._str) < 0;}bool string::operator<=(const string& s) const{return *this < s || *this == s;}bool string::operator>(const string& s) const{return !(*this <= s);}bool string::operator>=(const string& s) const{return !(*this < s);}ostream& operator<<(ostream& out, const string& s){for (size_t i=0;i<s.size();i++){out << s[i];}return out;}istream& operator>>(istream& in, string& s){s.clear();// 输入短串,不会浪费空间// 输入长串,避免不断扩容const size_t N = 1024;char buff[N];int i = 0;char ch = in.get();while (ch != ' ' && ch != '\n')//遇到空格和\n停止{buff[i++] = ch;if (i == N - 1){buff[i] = '\0';//最后一个复制为0然后加上s += buff;i = 0;}//也可以直接写s+=ch,不过占用内存高ch = in.get();}if (i > 0){buff[i] = '\0';s += buff;}return in;}istream& getline(istream& in, string& s, char delim){s.clear();const size_t N = 1024;char buff[N];int i = 0;char ch = in.get();while (ch != delim){buff[i++] = ch;if (i == N - 1){buff[i] = '\0';s += buff;i = 0;}ch = in.get();}if (i > 0){buff[i] = '\0';s += buff;}return in;}void test_string1(){string s1("hello world");cout << s1.c_str() << endl;string s2;cout << s2.c_str() << endl;s1 += ' ';s1 += '+';s1 += "hello ";s1 += "hello feng1111111111111111111111111";cout << s1.c_str() << endl;}void test_string2(){string s1("hello world");cout << s1.c_str() << endl;s1.insert(11, 3, 'x');cout << s1.c_str() << endl;s1.insert(6, 3, 'x');cout << s1.c_str() << endl;s1.insert(0, 3, 'x');cout << s1.c_str() << endl;string s2("hello world");cout << s2.c_str() << endl;s2.insert(11, "yyy");cout << s2.c_str() << endl;s2.insert(6, "yyy");cout << s2.c_str() << endl;s2.insert(0, "yyy");cout << s2.c_str() << endl;}void test_string3(){string s1("hello world");cout << s1.c_str() << endl;s1.erase(6, 2);cout << s1.c_str() << endl;s1.erase(6, 20);cout << s1.c_str() << endl;s1.erase(3);cout << s1.c_str() << endl;string s2("hello helleoo");cout << s2.find('e') << endl;cout << s2.find("helle") << endl;}void test_string4(){string s1("hello world");for (size_t i = 0; i < s1.size(); i++){s1[i]++;cout << s1[i] << " ";}cout << endl;string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";++it;}cout << endl;for (auto e : s1){cout << e << " ";}cout << endl;const string s2("hello world");for (auto e : s2){cout << e << " ";}cout << endl;}void test_string5(){string s1("hello world");string sub1 = s1.substr(6, 3);cout << sub1.c_str() << endl;string sub2 = s1.substr(6, 300);cout << sub2.c_str() << endl;string sub3 = s1.substr(6);cout << sub3.c_str() << endl;string s2("hello fengxxxxxxxxxxxxxxxxxx");s1 = s2;cout << s1.c_str() << endl;cout << s2.c_str() << endl;s1 = s1;cout << s1.c_str() << endl;}void test_string6(){/*string s1("hello world");string s2("hello bit");cout << s1 << endl;cout << s2 << endl;string s3;cin >> s3;cout << s3 << endl;*/string s1, s2;cin >> s1 >> s2;cout << s1 << endl;cout << s2 << endl;string s3;//getline(cin, s3);getline(cin, s3, '!');cout << s3 << endl;}void test_string7(){string s1("1111111111111");string s2(s1);cout << s1 << endl;cout << s2 << endl;string s3("222222222222222222222222222");s1 = s3;cout << s1 << endl;cout << s3 << endl;//s1.swap(s2);//swap(s1, s2);cout << s1 << endl;cout << s2 << endl;}
}

3.wctest.cpp

#include"string.h"int main()
{//wc::test_string1();//wc::test_string3();wc::test_string5();return 0;
}

4>>结语

        今日C++到这里就结束啦,如果觉得文章还不错的话,可以三连支持一下。感兴趣的宝子们欢迎持续订阅小枫,小枫在这里谢谢宝子们啦~小枫の主页还有更多生动有趣的文章,欢迎宝子们去点评鸭~C++的学习很陡,时而巨难时而巨简单,希望宝子们和小枫一起坚持下去~你们的三连就是小枫的动力,感谢支持~

相关文章:

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…...

解决Linux访问HuggingFace的问题(操作记录)

目录 一、软件下载 二、软件使用 1、启动软件 2、设置网络 3、注意事项 三、linux命令行访问 1、问题分析 2、设置命令行代理 一、软件下载 MrQiguan/cfw-linux 二、软件使用 1、启动软件 ./cfw 注&#xff1a;先选择节点&#xff0c;再开启Start with Linux&#…...

《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代

Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…...

verilog+systemVerilog写代码bug总结

前言 此文用来记录我在写verilog项目时遇到的bug,方便回顾&#xff0c;也供大家参考。 语言&#xff1a;verilog、systemverilog 平台&#xff1a;vivado 2021.01 bug记录和解决 如何让计数从0开始&#xff0c;而不是从1开始&#xff1f; 情景描述&#xff1a;我现在要实现…...

【Java基础面试题014】for循环与增强for的区别是什么?

回答重点 for for是一种传统的循环结构&#xff0c;允许开发者控制循环的初始值&#xff0c;终止条件和步进方式 主要特点&#xff1a; 灵活性&#xff1a;可以控制循环的初始值、终止条件和步进方式使用于数组&#xff1a;可以通过索引访问&#xff0c;使用索引进行反向遍…...

2412d,d的8月会议

原文 总结 替换D的逃逸分析 Rikki说,他一个月前曾与Dennis讨论过简化D的逃逸分析,但没有结果.在BeerConf上,他再次提起了它,Dennis说他一直在考虑它. Rikki也与Walter谈过这件事,Walter曾说过DIP1000并没有完全如期工作,且有点太复杂了. 因此,Rikki想讨论按D逃逸分析方法替…...

如何在Qt中应用html美化控件

在Qt中应用HTML美化控件&#xff0c;主要可以通过以下几种方式&#xff1a; 使用QWebEngineView&#xff1a;QWebEngineView是基于Chromium引擎的控件&#xff0c;用于显示和交互HTML内容。它支持现代Web标准和技术&#xff0c;如HTML5、CSS3和JavaScript。你可以通过以下步骤…...

vue3实现商城系统详情页(前端实现)

目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么&#xff1f;找工作没找到&#xff0c;准备在家躺平两个月。正好整理一下当时的毕业设计&#xff0c;是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…...

[Pro Git#4] 标签 | 理解 | 创建 | push

目录 一、理解标签 二、创建标签 三、操作标签 一、理解标签 标签定义&#xff1a;在Git中&#xff0c;标签&#xff08;tag&#xff09;是对某次提交&#xff08;commit&#xff09;的一个标识&#xff0c;相当于起了一个别名。应用场景示例&#xff1a; 在项目发布某个版…...

在M系列芯片的Mac上使用Uniapp开发的依赖安装指南

在M系列芯片的Mac上使用Uniapp开发的依赖安装指南 在基于M系列芯片&#xff08;例如M3、M4&#xff09;的Mac上进行Uniapp开发时&#xff0c;使用esbuild和rollup等依赖包时需要注意处理不同架构的支持。具体问题出现在darwin-arm64&#xff08;ARM架构&#xff09;和darwin-x…...

delve调试环境搭建—golang

原文地址&#xff1a;delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境&#xff0c;习惯在 linux终端vim 环境下开发&#xff0c;所以找了golang的调试工具&#xff0c;delve类似gdb的调试界…...

暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)

前提 之前开自己的GitHub项目&#xff0c;想着不是团队项目&#xff0c;偷懒没有配置eslint&#xff0c;后面发现还是不行。eslint的存在可以帮助我们规范代码格式&#xff0c;同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外&#xff0c;团队使用eslint也是好处颇多…...

vscode 使用说明

文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff…...

单片机:实现蜂鸣器数码管的显示(附带源码)

单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示&#xff0c;而数码管则用于显示数字或字母。在本项目中&#xff0c;我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统&#xff0c;结合使用蜂鸣器和数码管&#xf…...

Next.js v15-基于NextAuth进行身份验证

NextAuth.js 抽象化了管理会话、登录和注销以及身份验证的其他方面所涉及的大部分复杂性操作。虽然您可以手动实现这些功能&#xff0c;但该过程可能非常耗时且容易出错。NextAuth.js简化了流程&#xff0c;为 Next.js 应用程序中的身份验证提供了统一的解决方案。 步骤 通过…...

解锁Vue组件的奇妙世界

文章目录 一、Vue 组件概述&#xff08;一&#xff09;什么是 Vue 组件&#xff08;二&#xff09;Vue 组件的优点 二、Vue 组件的创建方式&#xff08;一&#xff09;全局注册&#xff08;二&#xff09;局部注册&#xff08;三&#xff09;单文件组件&#xff08;SFC&#xf…...

二分查找【Lecode_HOT100】

文章目录 1.搜索插入位置No.352.搜索二维矩阵No.743.在排序数组中查找元素的第一个和最后一个位置No.344.搜索旋转排序数组No.335.寻找旋转排序数组中的最小值No.153 1.搜索插入位置No.35 class Solution {public int searchInsert(int[] nums, int target) {int l 0;int r n…...

解决git clone时报错“authentication failed for huggingface repository”

问题1&#xff1a; 已经获取了模型的授权&#xff0c;但是git clone时&#xff0c;弹出弹窗 输入huggingface的用户名和密码后&#xff0c;报错如下 解决方式1&#xff1a; 阅读红框标注的说明&#xff0c;“password authentication in git is no longer supported.”&#…...

力扣-图论-16【算法学习day.66】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题分析

【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题 情况实验结论情况 在用GL-SFT1200路由器切换中继模式时,由于web密码忘却,需要重置,但根据官网使用手册,或者对应的中文版手册,重置失败。通过跟商家联系,进行uboot刷机,提供了指导文档,尝试后刷机成功…...

LeetCode 热题 100_K 个一组翻转链表(31_25_困难_C++)(四指针法)

LeetCode 热题 100_K 个一组翻转链表&#xff08;31_25&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;四指针法&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;四指针法&#x…...

【LeetCode】35.搜索插入位置

目录 LeetCode35.搜索插入位置题解解题思路code1 暴力解法2 二分查找什么是二分查找&#xff1f;二分查找的原理二分查找图解二分查找的优缺点……更新中 LeetCode35.搜索插入位置题解 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如…...

拿到小米 Offer,却迷茫了。。

大家好&#xff0c;我是程序员鱼皮&#xff0c;12 月了&#xff0c;很多小伙伴也拿到了秋招的 Offer&#xff08;没拿到也不要灰心&#xff09;&#xff0c;但即使拿到 Offer&#xff0c;可能还会有一些其他的顾虑。今天分享我们编程导航一位鱼友的提问&#xff0c;给大家作为学…...

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip

redis集群 服务器更换ip&#xff0c;怎么办&#xff0c;怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后&#xf…...

运行 Mongodb Server

如何使用 mongod 命令通过配置文件启动 MongoDB Server 适用于通过 Homebrew 安装的 MongoDB Server 如果您的 MongoDB Server 是通过 Homebrew 安装的&#xff0c;则安装过程中会自动创建必要的文件夹和配置文件&#xff08;如 mongod.conf&#xff09;。您可以直接使用以下…...

“年轻科技旗舰”爱玛A7 Plus正式发布,全国售价4999元

12月18日&#xff0c;备受行业瞩目的“A7上场 一路超神”爱玛旗舰新品发布会在爱玛台州智造工厂盛大举行。 作为年末“压轴产品”的“两轮豪华轿跑”爱玛A7Plus重磅上场&#xff0c;以“快、稳、帅、炫、智、爽”六大超神技惊艳四座&#xff0c;不仅践行了爱玛科技的精品战略&…...

深入探索 C++ 编程技巧:从案例中学习高效实践

深入探索 C 编程技巧&#xff1a;从案例中学习高效实践 C 是一门功能强大且灵活的编程语言&#xff0c;被广泛应用于系统开发、高性能计算、游戏引擎等领域。然而&#xff0c;初学者和有经验的开发者常常会在代码优化、设计模式和语言特性中面临挑战。这篇文章将通过实际案例&…...

鸿蒙操作系统简介

华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;&#xff0c;是华为公司于2019年8月9日在东莞举行的华为开发者大会&#xff08;HDC.2019&#xff09;上正式发布的面向全场景的分布式操作系统&#xff0c;可以创造一个超级虚拟终端互联的世界&#xff0c;将人、设备、场…...

LabVIEW起落架震台检测

在现代飞机制造与维护过程中&#xff0c;起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统&#xff0c;通过模拟飞机着陆过程&#xff0c;准确捕捉起落架在着陆时承受的各种动力学特性和应力响应&#xff0c;有效提升起落架设计的精度与可靠…...

git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息

git remote -v 是一个 Git 命令&#xff0c;用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时&#xff0c;你会看到类似以下的输出&#xff1a; origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…...

Java基础知识(四) -- 面向对象(中)

1.包 1.3.1 包的作用 &#xff08;1&#xff09;可以避免类重名&#xff1a;有了包之后&#xff0c;类的全名称就变为&#xff1a;包.类名【便于使用】&#xff08;2&#xff09;分类组织管理众多的类【便于管理类】&#xff08;3&#xff09;可以控制某些类型或成员的可见范…...

RAG开发中,如何用Milvus 2.5 BM25算法实现混合搜索

01. 背景 混合搜索(Hybrid Search)作为RAG应用中Retrieve重要的一环&#xff0c;通常指的是将向量搜索与基于关键词的搜索&#xff08;全文检索&#xff09;相结合&#xff0c;并使用RRF算法合并、并重排两种不同检索的结果&#xff0c;最终来提高数据的召回率。全文检索与语义…...

RadiAnt DICOM - 基本主题 :从 PACS 服务器打开研究

正版序列号获取&#xff1a;https://r-g.io/42ZopE RadiAnt DICOM Viewer PACS 客户端功能允许您从 PACS 主机&#xff08;图片存档和通信系统&#xff09;搜索和下载研究。 在开始之前&#xff0c;您需要确保您的 PACS 服务器和 RadiAnt 已正确配置。有关配置说明&#xff0c…...

使用 CFD 加强水资源管理:全面概述

探索 CFD&#xff08;计算流体动力学&#xff09;在增强保护人类健康的土木和水利工程实践方面的重大贡献。 挑战 水资源管理是指规划、开发、分配和管理水资源最佳利用的做法。它包括广泛的活动&#xff0c;旨在确保水得到有效和可持续的利用&#xff0c;以满足各种需求&…...

AMS1117芯片驱动电路·降压芯片的驱动电路详解

编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 AMS1117常见封装 很常用的一种LDO降压芯片&#xff0c;LDO(Low Dropout Regulator)降压芯片是线性稳压器&#xff0c;这种IC因为内部集成的不是开关电路&#xff0c;只能将输入与输出的电压差值通过内部…...

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…...

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天&#xff0c;智慧充电桩作为支持这一变革的关键基础设施&#xff0c;正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区&#xff0c;从企业园区到住宅小区&#xff0c;智慧充电桩不仅提供了便捷的充电服务&#xff0c;还通过…...

随机森林算法原理

随机森林算法原理 算法流程随机森林的生成随机森林的预测 算法总结随机森林的优点随机森林的缺点 算法流程 随机森林的生成 输入训练数据 D&#xff0c;样本个数为 m &#xff0c;待学习的决策树数量为 T。 对于 t 1,2,…,T&#xff0c;从 D 中有放回地采样 m 次&#xff0c…...

java中sha256和md5某个字符串实例代码

在Java中&#xff0c;可以使用 java.security.MessageDigest 类来计算字符串的 SHA-256 和 MD5 哈希值。以下是如何为给定的字符串生成这两种哈希值的实例代码。 生成SHA-256和MD5哈希值的示例代码 Java 深色版本 import java.security.MessageDigest; import java.security.N…...

thinkphp8自带分页bootstrap

tp8引用的是bootstrap3.4.1这个版本&#xff1b; 前端结构&#xff1a; <ul class"pagination"><li><a href"/index.php?page4"></a></li><li><a href"/index.php?page1">1</a></li>…...

C++算法第九天

本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 暴力解法 二分解法 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 重点回顾 朴素二分 非朴素二分 重点一 重点二 重点三 第一题 题目链接 153. 寻找旋转排序数组中的最小值 - 力…...

ASRPRO学习笔记一之语音模型位置和语音替换

一、语音替换的步骤 1、扬声器录音 打开GoldWave,点击工具栏中的蓝色控制属性按钮&#xff0c;点击设备&#xff0c;选择扬声器&#xff0c;点击ok。打开电脑上的网易云音乐&#xff0c;点击红色的录制按钮&#xff0c;开始录制音乐&#xff0c;在网易云音乐上点击播放音乐,录…...

QT编译opencv

一.QT5.12编译 1.QT环境 QT5.12 Qt Creator 12.0.2 2.OpenCV文件 因为QT5.12版本qt最后支持到2021.12月&#xff0c;所以这里选择的opencv版本为2021.4月发布的opencv-3.4.16版本 官网下载地址&#xff1a;https://opencv.org/releases/ 最新版本&#xff1a;opencv-3.4.16.…...

[笔记]关于Qt的nativeEvent事件无法接收window消息的Bug

1.nativeEvent事件无法接收window消息 此处不是nativeEvent不能接收&#xff0c;是possmessage一定要写对发送的软件名称&#xff0c;这个名称在Qt中是主界面类的名称&#xff0c;就是主界面UI的名称&#xff0c;而不是rc文件中定义的名称。 所以在FindWindow函数获取目标窗口…...

基于深度学习的猫狗识别系统【深度学习课设】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…...

Java性能调优 - JVM性能监测及调优

JVM 内存模型概述 堆 堆是JVM内存中最大的一块内存空间&#xff0c;该内存被所有线程共享&#xff0c;几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代&#xff0c;新生代又被进一步划分为Eden和Survivor区&#xff0c;最后Survivor由From Survivor和To Su…...

[代码随想录21二叉树]二叉树的修改和改造,修剪二叉树,将有序数组转为二叉搜索树

前言 二叉树章节最后的题目了&#xff0c;就是对搜索二叉树的改造&#xff0c; 题目链接 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、修剪二叉搜索树 思路&#xff1a;等会…...

C# OpenCV机器视觉:图像平滑

在一个寒冷的冬日&#xff0c;阿强窝在家里的沙发上&#xff0c;裹着厚厚的毛毯&#xff0c;手里捧着一杯热巧克力。他的朋友们约他一起去滑雪&#xff0c;但阿强却更喜欢待在温暖的家中&#xff0c;享受这份宁静。突然&#xff0c;他的手机响了&#xff0c;是朋友们发来的滑雪…...

Dubbo 3.x源码(26)—Dubbo服务引用源码(9)应用级服务发现订阅refreshServiceDiscoveryInvoker

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了MigrationRuleHandler这个处理器&#xff0c;它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现之间迁移的关键…...

java client http请求 返回数据 实时循环监听 url 中资源是否生成

1、php 中 执行 exec 调用操作系统 命令行 执行 以下 java 代码 生成 的jar 2、php 执行命令是 以上1 需要命令行 输入 参数 taskid 3、实现实时监听 MP3 url 是否生成 4、 package com.example.filedemo.controller;import java.io.BufferedReader; import java.io.InputStre…...