[c++]—string类___深度学习string标准库成员函数与非成员函数(string的增删查改函数)

沉淀,沉淀,再沉淀.

👩🏻‍💻作者:chlorine

👉上一篇:string标准库成员函数和非成员函数(上)

目录

🍭构造和析构的实现 

🍭 string→c类型的字符串数组

🍭operator[]类对象元素的访问

🍭返回字符串的长度

🍭迭代器进行遍历访问字符串

👉增

❗append() 与 push_back()

❗reserve()扩容

 ❗operator+=()复用

👉删

❗erase

👉插

❗insert()

👉找

❗find()

❗获得子串substr() 

🍭改变字符串长度 

🍭流插入<<流提取>>

❗clear 

🍭比较字符串大小 

🍭字符串赋值 

❗operator()

 ❗swap() 

💻总代码

🚩string.h 

🚩test.cpp


 从上一篇我们了解了string标准库成员函数和非成员函数的了解,这一章我们继续学习string标准库中剩余的成员函数和非成员函数。

这一次我们模拟类实现对字符串的增删查改,在此之前我们设定一个命名空间cl,不用std命名空间。我们可以在测试的时候与std命名空间进行对比,看是否出现问题。

#include<iostream>
#include<string>
using namespace std;namespace cl
{class string{};
}

🍭构造和析构的实现 

我们得开一个_size大小空间的字符串,进行初始化,可以选择在函数体内赋值或者初始化列表进行初始化,为了没有顺序的思考,我们就直接在函数体内初始化吧。

#pragma once#include<iostream>
#include<assert.h>
#include<string>
using namespace std;namespace cl
{class string{public:string(const char* str=" "){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];memcpy(_str, str, _size + 1);}~string(){delete[] _str;_size = _capacity = 0;}private:char* _str;size_t _size;size_t _capacity;};
}

🍭 string→c类型的字符串数组

c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址。

const char* c_str() const{return _str;}

因为我们还没写流插入和流提取的函数,所以我们必须调用c_str()成员函数,c_str()函数返回一个指向正规C字符串的指针常量,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式


🍭operator[]类对象元素的访问

char& operator[] (size_t pos){assert(pos < _size);return _str[pos];}const char& operator[] (size_t pos) const{assert(pos < _size);return _str[pos];}


🍭返回字符串的长度

size_t size() const{return _size;}


🍭迭代器进行遍历访问字符串

typedef char* iterator;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;}

大家可以通过调试深入了解一下即可。 


现在我们进入类中字符串的增删查改函数的操作

👉增

❗append() 与 push_back()

这里需要写个扩容函数reserve()

reserve()扩容

void reserve(size_t n = 0){if (n > _capacity){char* tmp = new char[n + 1];//开辟一个n个空间memcpy(tmp, _str, _size + 1);//将_str里面字符拷贝给tmpdelete[] _str;//销毁_str_str = tmp;//然后将tmp字符串赋值给_str_capacity = n;}}

//增加字符void push_back(char c){if (_size == _capacity){//2倍扩容reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = c;++_size;_str[_size] = '\0';}//增加字符串
void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){// 至少扩容到_size + lenreserve(_size + len);}memcpy(_str + _size, str, len + 1);_size += len;}

 ❗operator+=()复用

string& operator+=(char ch){push_back(ch);return *this;}string& operator+=(const char* str){append(str);return *this;}


👉删

❗erase

//删void erase(size_t pos = 0, size_t len = npos)//删除从pos开始的len长度{assert(pos <= _size);//删的结束位置>=截至位置就直接给最后截至位置结束if (len == npos || pos + len >= _size){_str[pos] = '\0';//直接给pos位置置'\0'_size = pos;_str[_size] = '\0';}else//删除的结束位置<size,那么就得给end后面的值赋值给pos开始之后的{size_t end = pos + len;while (end <= _size){_str[pos++] = _str[end++];}_size -= len;}}


👉

❗insert()

void insert(size_t pos, size_t n, char ch)//在pos位置插入n个字符{assert(pos <= _size);//如果大于容量,就扩容if (_size + n > _capacity){reserve(_size + n);}//end所在的地方在字符串位置int end = _size;while (end >= (int)pos){_str[end + n] = _str[end];--end;}for (size_t i = 0; i < n; i++){_str[pos + i] = ch;}_size += n;}


👉找

❗find()

size_t find(char ch, size_t pos = 0)//从pos位置找到字符ch{assert(pos < _size);for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;}size_t find(const char* str, size_t pos = 0)//从pos位置找到字符串str{assert(pos < _size);const char* ptr = strstr(_str + pos, str);if (ptr){return ptr - _str;}else{return npos;}}

❗获得子串substr() 

string substr(size_t pos = 0, size_t len = npos)//从pos位置开始的len个字符的字串{assert(pos < _size);size_t n = len;if (len == npos || pos + len > _size){n = _size - pos;//子串长度}string tmp;//创建一个字串tmptmp.reserve(n);//字串的容量for (size_t i = pos; i < pos + n; i++){tmp += _str[i];//赋值}return tmp;}

我们还是用这段代码来测试。 

这里涉及了拷贝构造。

string(const string& s){_str = new char[s._capacity + 1];memcpy(_str, s._str, s._size + 1);_size = s._size;_capacity = s._capacity;}


🍭改变字符串长度 

	void resize(size_t n, char c = '\0'){if (n < _size){_size = n;_str[n] = '\0';}else{reserve(n);for (size_t i = _size; i < n; i++){_str[i] = c;}_size = n;_str[_size] = '\0';}}


🍭流插入<<流提取>>

我们在类外。

ostream& operator<<(ostream& out, const string& s){/*for (size_t i = 0; i < s.size(); i++){out << s[i];}*/for (auto ch : s){out << ch;}return out;}istream& operator>>(istream& in, string& s){s.clear();char ch = in.get();// 处理前缓冲区前面的空格或者换行while (ch == ' ' && ch == '\n'){ch = in.get();//如果是空格和换行,直接跳过读下一个}//给定一个局部数组127.为了防止过多的开空间如果string对象的容量大char buff[128];int i = 0;while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 127){//如果i=127那么就将buff[127]置'\0'buff[127] = '\0';s += buff;i = 0;//将i置0重新开始}ch = in.get();}if (i != 0){buff[i] = '\0';s += buff;}return in;}

 

❗clear 

void clear(){_str[0] = '\0';_size = 0;}


🍭比较字符串大小 

//bool operator<(const string& s)//{//	size_t s1 = 0;//	size_t s2 = 0;//	//先判断字符对应的ascii码值是否小于//	while (s1 < _size && s2 < s._size)//	{//		if (_str[s1] < s._str[s2])//		{//			return true;//		}//		else if(_str[s1]>s._str[s2])//		{//			return false;//		}//		else//		{//			s1++;//			s2++;//		}//	}//	//结束循环之后说明有下面三种情况//	"hello" "hello"   false"helloxx" "hello" false"hello" "helloxx" true//	return _size < s._size;//}bool operator<(const string& s)const{//先判断字符的asscii值int ret = memcmp(_str, s._str, _size < s._size ? _size : s._size);//字符相等然后现在判断长度问题//"hello" "hello"   false"helloxx" "hello" false"hello" "helloxx" truereturn ret == 0 ? _size < s._size : ret < 0;}bool operator==(const string& s)const{return _size == s._size&& memcmp(_str, s._str, _size < s._size ? _size : s._size) == 0;}bool operator<=(const string& s)const{return (*this < s) || (*this == s);}bool operator>(const string& s)const{return !(*this <= s);}bool operator>=(const string& s)const{return (*this > s) || (*this == s);}bool operator!=(const string& s) const{return !(*this == s);}


🍭字符串赋值 

❗operator()

传统写法: 

// s1 = s3//string& operator=(const string& s)//{//	if (this != &s)//	{//		char* tmp = new char[s._capacity + 1];//创建新的字符串对象//		memcpy(tmp, s._str, s._size+1);//然后拷贝//		delete[] _str;//销毁_str//		_str = tmp;//将tmp赋值给_str//		_size = s._size;//内置类型的值赋值给//		_capacity = s._capacity;//	}//	return *this;//}

 ❗swap() 

现代写法: 

//俩个对象进行交换,要将俩个对象的内置类型成员变量都得交换void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}//string& operator=(const string& s)//{//	if (*this != s)//	{//		string tmp(s);//		//this->swap(tmp);//		swap(tmp);//	}//	return *this;//}string& operator=(string& s){//s1=s3swap(s);return *this;}

💻总代码

🚩string.h 

#pragma once#pragma once
#include<assert.h>
#include<string.h>
#include<iostream>
using namespace std;
namespace cl
{class string{public:typedef char* iterator;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;}//初始化//可以初始化列表//也可以函数体内赋值(这里更推荐后者)string(const char* str = ""){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);}const char* c_str() const{return _str;}const char& operator[] (size_t pos) const{assert(pos < _size);return _str[pos];}char& operator[] (size_t pos){assert(pos < _size);return _str[pos];}size_t size() const{return _size;}// s1 = s3//string& operator=(const string& s)//{//	if (this != &s)//	{//		char* tmp = new char[s._capacity + 1];//创建新的字符串对象//		memcpy(tmp, s._str, s._size+1);//然后拷贝//		delete[] _str;//销毁_str//		_str = tmp;//将tmp赋值给_str//		_size = s._size;//内置类型的值赋值给//		_capacity = s._capacity;//	}//	return *this;//}//俩个对象进行交换,要将俩个对象的内置类型成员变量都得交换void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}//string& operator=(const string& s)//{//	if (*this != s)//	{//		string tmp(s);//		//this->swap(tmp);//		swap(tmp);//	}//	return *this;//}string& operator=(string& s){//s1=s3swap(s);return *this;}void clear(){_str[0] = '\0';_size = 0;}~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}void reserve(size_t n = 0){if (n > _capacity){char* tmp = new char[n + 1];//开辟一个n个空间memcpy(tmp, _str, _size + 1);//将_str拷贝给tmpdelete[] _str;//销毁_str_str = tmp;//然后将tmp字符串赋值给_str_capacity = n;}}void push_back(char c){if (_size == _capacity){//2倍扩容reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = c;++_size;_str[_size] = '\0';}void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){// 至少扩容到_size + lenreserve(_size + len);}memcpy(_str + _size, str, len + 1);_size += len;}string& operator+=(char ch){push_back(ch);return *this;}string& operator+=(const char* str){append(str);return *this;}void insert(size_t pos, size_t n, char ch)//在pos位置插入n个字符{assert(pos <= _size);//如果大于容量,就扩容if (_size + n > _capacity){reserve(_size + n);}//end所在的地方在字符串位置int end = _size;while (end >= (int)pos){_str[end + n] = _str[end];--end;}for (size_t i = 0; i < n; i++){_str[pos + i] = ch;}_size += n;}void erase(size_t pos = 0, size_t len = npos)//删除从pos开始的len长度{assert(pos <= _size);if (len == npos || pos + len >= _size){_str[pos] = '\0';//直接给pos位置置'\0'_size = pos;_str[_size] = '\0';}else{size_t end = pos + len;while (end <= _size){_str[pos++] = _str[end++];}_size -= len;}}size_t find(char ch, size_t pos = 0)//从pos位置找到字符ch{assert(pos < _size);for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;}size_t find(const char* str, size_t pos = 0){assert(pos < _size);const char* ptr = strstr(_str + pos, str);if (ptr){return ptr - _str;}else{return npos;}}string(const string& s){_str = new char[s._capacity + 1];memcpy(_str, s._str, s._size + 1);_size = s._size;_capacity = s._capacity;}string substr(size_t pos = 0, size_t len = npos)//从pos位置开始的len个字符的字串{assert(pos < _size);size_t n = len;if (len == npos || pos + len > _size){n = _size - pos;//子串长度}string tmp;//创建一个字串tmptmp.reserve(n);//字串的容量for (size_t i = pos; i < pos + n; i++){tmp += _str[i];//赋值}return tmp;}void resize(size_t n, char c = '\0'){if (n < _size){_size = n;_str[n] = '\0';}else{reserve(n);for (size_t i = _size; i < n; i++){_str[i] = c;}_size = n;_str[_size] = '\0';}}//bool operator<(const string& s)//{//	size_t s1 = 0;//	size_t s2 = 0;//	//先判断字符对应的ascii码值是否小于//	while (s1 < _size && s2 < s._size)//	{//		if (_str[s1] < s._str[s2])//		{//			return true;//		}//		else if(_str[s1]>s._str[s2])//		{//			return false;//		}//		else//		{//			s1++;//			s2++;//		}//	}//	//结束循环之后说明有下面三种情况//	"hello" "hello"   false"helloxx" "hello" false"hello" "helloxx" true//	return _size < s._size;//}bool operator<(const string& s)const{//先判断字符的asscii值int ret = memcmp(_str, s._str, _size < s._size ? _size : s._size);//字符相等然后现在判断长度问题//"hello" "hello"   false"helloxx" "hello" false"hello" "helloxx" truereturn ret == 0 ? _size < s._size : ret < 0;}bool operator==(const string& s)const{return _size == s._size&& memcmp(_str, s._str, _size < s._size ? _size : s._size) == 0;}bool operator<=(const string& s)const{return (*this < s) || (*this == s);}bool operator>(const string& s)const{return !(*this <= s);}bool operator>=(const string& s)const{return (*this > s) || (*this == s);}bool operator!=(const string& s) const{return !(*this == s);}const static size_t npos;private:char* _str;size_t _size;size_t _capacity;};const size_t string::npos = -1;ostream& operator<<(ostream& out, const string& s){/*for (size_t i = 0; i < s.size(); i++){out << s[i];}*/for (auto ch : s){out << ch;}return out;}istream& operator>>(istream& in, string& s){s.clear();char ch = in.get();// 处理前缓冲区前面的空格或者换行while (ch == ' ' && ch == '\n'){ch = in.get();//如果是空格和换行,直接跳过读下一个}//给定一个局部数组127.为了防止过多的开空间如果string对象的容量大char buff[128];int i = 0;while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 127){//如果i=127那么就将buff[127]置'\0'buff[127] = '\0';s += buff;i = 0;//将i置0重新开始}ch = in.get();}if (i != 0){buff[i] = '\0';s += buff;}return in;}
};

🚩test.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"string.h"
#include<iostream>
#include<string>
//构造函数
void test1()
{cl::string s1("chenle");cout << s1.c_str() << endl;cl::string s2;cout << s2.c_str() << endl;
}
//operator[]
void test2()
{cl::string s1("chenle");//调用constfor (size_t i = 0; i < s1.size(); i++){s1[i]++;}cout << s1.c_str() << endl;cout << endl;//自动调用非constfor (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;
}void test3()
{//cl::string s3("chenle");cl::string s1("chenle");cl::string::iterator it = s1.begin();//auto it = s1.begin();while (it != s1.end()){*it += 1;cout << *it << " ";++it;}cout << endl;//cl::string::const_iterator cit = s3.begin();//auto cit = s3.begin();//while (cit != s3.end())//{//	//*cit += 1;//	cout << *cit << " ";//	++cit;//}//cout << endl;for (auto ch : s1){cout << ch << " ";}cout << endl;
}void test4()
{cl::string s4("chenle");//s4.push_back(' ');//s4.push_back('z');//s4.append("hangyuanfei");//cout << s4.c_str() << endl;s4 += ' ';s4 += 'z';s4 += "hangyuanfei";cout << s4.c_str() << endl;
}void test5()
{string s5("chenle");//s5.insert(0, 5, 'z');cout << s5.c_str() << endl;s5.erase(2, 5);cout << s5.c_str() << endl;
}
void test6()
{cl::string url = "https://legacy.cplusplus.com/reference/string/string/";// 协议protocol  域名  资源名size_t pos1 = url.find("://");string protocol;if (pos1 != cl::string::npos){cl::string protocol = url.substr(0, pos1);cout << protocol.c_str() << endl;}size_t pos2 = url.find('/', pos1 + 3);//从pos1+3位置开始找'/'if (pos2 != string::npos){cl::string domain = url.substr(pos1 + 3, pos2 - (pos1 + 3));//从pos1+3的位置,截取(pos2-(pos1+3))的长度,读到遇到第一个'/'位置cl::string uri = url.substr(pos2 + 1);//直接从pos2+1位置后读到最后即可cout << domain.c_str() << endl;cout << uri.c_str() << endl;}
}void test7()
{cl::string s7("chenle");s7.resize(4);cout << s7.c_str() << endl;//cout << s7 << endl;cl::string s8("chenle");s8.resize(20, 'y');cout << s8.c_str() << endl;//cout << s8 << endl;
}void test8()
{cl::string s8("chenlelelelle");s8 += '\0';s8 += "zzzzzz";cout << s8.c_str() << endl;cout << s8 << endl;cl::string copy(s8);cout << s8 << endl;cout << copy << endl;s8 += "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";cout << s8 << endl;}void test9()
{//string s1("bb");//string s2("aaa");//cout << (s1 < s2) << endl;cl::string s1("hello");cl::string s2("hello");cout << (s1 < s2) << endl;cout << (s1 > s2) << endl;cout << (s1 == s2) << endl << endl;cl::string s3("hello");cl::string s4("helloxxx");cout << (s3 < s4) << endl;cout << (s3 > s4) << endl;cout << (s3 == s4) << endl << endl;cl::string s5("helloxxx");cl::string s6("hello");cout << (s5 < s6) << endl;cout << (s5 > s6) << endl;cout << (s5 == s6) << endl << endl;
}void test10()
{cl::string s1("chenle");cl::string s2(s1);//拷贝构造cout << s1.c_str() << endl;cout << s2.c_str() << endl;cl::string s3("xxxxxxxxxxxxx");s1 = s3;//赋值cout << s1.c_str() << endl;cout << s3.c_str() << endl;
}void test11()
{cl::string s1;cin >> s1;cout << s1;}int main()
{//test1();//test2();//test3();//test4();//test5();//test6();//test7();//test8();//test9();//test10();test11();return 0;
}

 

沉淀,沉淀,再沉淀。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言-动态内存管理

文章目录 一、为什么会有动态内存管理二、申请内存函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误四、练习 一、为什么会有动态内存管理 1.我们一般的开辟空间方式&#xff1a; int a 0;//申请4个字节空间 int arr[10] { 0 };//申请40个字节空间2.这样…

解决在Linux中进行redis的主从复制时出现的从机可以获取到主机的信息,主机获取不到从机的信息~

主机&#xff1a; 从机1&#xff1a; 从机2&#xff1a; 出现上述的原因是我在redis.conf中设置了密码&#xff0c;那么就导致了我在进行主从复制时&#xff0c;需要进行密码验证&#xff0c;然后我在网上查阅了很多资料&#xff0c;有的说让在从机中指定密码&#xff0c;有的说…

一对多聊天室

多人聊天包 由于要先创建服务面板&#xff0c;接收客户端连接的信息&#xff0c;此代码使用顺序为先启动服务端&#xff0c;在启动客户端&#xff0c;服务端不用关&#xff0c;不然会报错。多运行几次客户端&#xff0c;实现单人聊天 创建服务面板 package yiduiduo;import j…

【头歌系统数据库实验】实验7 SQL的复杂多表查询-1

目录 第1关&#xff1a;求各颜色零件的平均重量 第2关&#xff1a;求北京和天津供应商的总个数 第3关&#xff1a;求各供应商供应的零件总数 第4关&#xff1a;求各供应商供应给各工程的零件总数 第5关&#xff1a;求重量大于所有零件平均重量的零件名称 第6关&#xff1…

初识人工智能,一文读懂人工智能概论(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Python Django-allauth: 构建全面的用户身份验证系统

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Django-allauth是一个功能强大的Django插件&#xff0c;旨在简化和定制Web应用程序中的用户身份验证和管理。本文将深入介绍Django-allauth的核心功能、基本用法以及实际应用场景&#xff0c;通过丰富的示例代码…

AWTK 串口屏开发(1) - Hello World

1. 功能 这个例子很简单&#xff0c;制作一个调节温度的界面。在这里例子中&#xff0c;模型&#xff08;也就是数据&#xff09;里只有一个温度变量&#xff1a; 变量名数据类型功能说明温度整数温度。范围 (0-100) 摄氏度 2. 创建项目 从模板创建项目&#xff0c;将 hmi/…

网络运维与网络安全 学习笔记2023.12.4

网络运维与网络安全 学习笔记 第三十四天 今日目标 访问存储设备、配置yum源、使用yum管理软件 LAMP部署及测试、systemctl系统控制、SELinux-Firewall防护 访问存储设备 挂载/卸载设备 什么是挂载? 挂载&#xff0c;装载 将光盘/U盘/分区/网络存储等设备装到某个Linux目…

pycharm debug的时候变量显示不出来,一直Collecting data...问题解决

问题描述&#xff1a; 如图所示&#xff1a;一直加载不出来变量&#xff0c;显示Collecting data 解决办法&#xff1a; 在setting中给下图中的选项打勾 这下就可以了。 应该是调试时候有线程冲突&#xff0c;具体我也不太懂。

mysql服务日志打印,时区不对的问题

查资料发现 原来日志的时区和服务器的时区不是一个参数控制的 log_timestamps 单独控制日志的时区 show global variables like log_timestamps;看到默认的是UTC&#xff0c;只需要修改为和系统一致就行 #数据库中直接修改 set global log_timestampsSYSTEM;#配置文件my.cn…

springboot086靓车汽车销售网站

springboot086靓车汽车销售网站 成品项目已经更新&#xff01;同学们可以打开链接查看&#xff01;需要定做的及时联系我&#xff01;专业团队定做&#xff01;全程包售后&#xff01; 2000套项目视频链接&#xff1a;https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwd…

APP测试基本流程及测试点总结

APP测试基本流程及测试点总结 1 测试流程 1.1 流程图 1.2 测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。 1.3 测试资源 测试任务…

VQVAE

68、VQVAE预训练模型的论文原理及PyTorch代码逐行讲解_哔哩哔哩_bilibili本期视频主要讲解大规模无监督预训练模型之VQVAE的论文原理以及PyTorch代码逐行讲解&#xff0c;希望对大家理解VQVAE以及图像生成有帮助。, 视频播放量 9920、弹幕量 80、点赞数 485、投硬币枚数 322、收…

Linux:dockerfile编写搭建tomcat练习(9)

我使用的httpyum仓库 本地使用了5个文件&#xff0c;tomcat使用的官网解压直接用的包】 Dockerfile 主配置文件 基于centos基础镜像 jdk1.8.0_91 java环境 run.sh 启动脚本 centos.repo 仓库文件 tomcat 源码包 vim Dockerfile写入FROM centos MAINTAINER ta…

一个 postman实现参数化让我丢掉了一份20k的offer

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

Ubuntu22.04安装和卸载软件的命令行

一、安装 sudo apt install xxx 二、卸载 sudo apt remove xxx 三、卸载依赖包(可选) 第二步软件卸载之后&#xff0c;有一些依赖包没有被卸载。可以使用sudo apt autoremove xxx来卸载。如果不卸载应该也没什么影响

Andorid sudio 换行方法

1.遇到的问题&#xff0c;二维码内容要换行 String text "成绩&#xff1a;1000 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff…

阿里云服务器2核8G/4核16G/8核32G配置选择经济型、通用算力型、通用型哪个好?

2核8G/4核16G/8核32G配置的阿里云服务器在阿里云活动中目前有经济型e、通用算力型u1、通用型c7和通用型g8y四种实例可选&#xff0c;虽然配置相同&#xff0c;但是这些实例规格之间的价格差别是很大的&#xff0c;以2核8G配置为例&#xff0c;活动价格最便宜的经济型e实例2核8G…

2023亚太五岳杯量子计算挑战赛数学建模思路代码模型论文

2023五岳杯数学建模思路&#xff1a;比赛开始后第一时间更新&#xff0c;获取见文末名片 今年&#xff0c;APMCM亚太地区大学生数学建模竞赛组委会正式和玻色量子、中国移动云能力中心等多家单位达成合作。 开展APMCM校企合作高校巡回学术讲座活动&#xff0c;为企业、高校搭…