C++ string 的用法
目录
- string类
- string类接口函数及基本用法
- 构造函数,析构函数及赋值重载函数
- 元素访问相关函数
- operator[]
- at
- back和front
- 迭代器iterator
- 容量操作
- size()和length()
- capacity()
- max_size
- clear
- empty
- reserve
- resize
- shrink_to_fit
- string类对象修改操作
- operator+=
- push_back
- append
- assign
- insert
- erase
- replace
- swap
- pop_back
- 字符串操作
- c_str
- substr
- find和rfind
- find_first_of,find_last_of,find_first_not_of,find_last_not_of
- 非成员重载函数
- 关系操作符
- 流插入,流提取
- getline
- 类型转换函数
- VS下string的结构
string类
在C语言中,字符串都是以‘\0’
位结尾的一些字符的集合,为了方便操作,C标准库中已经给定了一些字符串操作函数,库中的函数与对象是分离的,不符合C++的封装思想
所以在C++中,string成为了一种容器,它有属于自己的结构和函数
如果想使用string类,需要#include<string>
和using namespace std
我们时常把
string
和STL中其他容器归到一起,但是实际上string
不是STL中的,string
类是在STL之前出现的用来专门解决字符串处理的问题
后来STL才在惠普实验室中发明出来
而string在C++标准库中,STL也在C++标准库中
string类接口函数及基本用法
构造函数,析构函数及赋值重载函数
string类中定义了7个构造函数
string()
,无参构造,会构造出空的的string类对象,即空字符串string(const string& str)
,拷贝构造string(const string& str, size_t pos, size_t len = npos)
,用string类型对象str
,从pos
位置开始,len
个长度的字串构造出2一个新对象 ,这里的参数len
是一个缺省参数,它的缺省参数为npos
,而这个npos
是string中定义的成员常量,它的值为-1,len
的类型为无符号整型,所以把-1赋值给len
后,len
的值就是整形的最大值,一个非常大的数。也就是如果传参时不传第二个参数,就从pos
位置开始直到字符串结束进行构造。
npos:
string (const char* s)
,用一个字符串进行构造string (const char* s, size_t n)
用字符串s
的前n
个字符进行构造string (size_t n, char c)
,在字符串中用连续复制n
个字符c
进行构造template <class InputIterator> string (InputIterator first, InputIterator last)
用迭代器进行构造,按照[first,last)左闭右开,按照字节序进行构造
void test1()
{string s1;//无参构造,空字符串string s2(s1);//拷贝构造string s3("abcdefg");//用一个字符串进行构造string s4(s3, 2, 3);//在s3的2位置开始跨3个字符进行构造string s5(s3, 2);//在s3的2位置构造到最后string s6("abcde", 2);//复制"abcde"的前2个字符string s7(10, 'a');//构造连续10个字符'a'
}
string的析构函数只有一个:
~string();
赋值重载函数
string类中实现了string对象,字符串,和字符的赋值重载
void test2()
{string s1;string s2("111");s1 = "abcde";s1 = s2;s1 = 'a';
}
元素访问相关函数
operator[]
在C语言的字符串中,数据是存放在数组里的,我们可以使用[]
访问某一下标处的字符
那么其实在C++中的string类中也可以,string类中实现了[]
的重载
char& operator[] (size_t pos)
,可以进行读写操作
const char& operator[] (size_t pos) const
只能进行读的操作,不可以进行写的操作
void test3()
{string s1("abcdefg");for (size_t i = 0; i < 7; i++){//通过[]访问cout << s1[i] << " ";}cout << endl;for (size_t i = 0; i < 7; i++){//通过[]修改s1[i]++;}cout << s1 << endl;
}
在operater[]内部,对于越界的判断是使用assert()
,如果越界,就断言
string s1 = "hello"; char s2[] = "hello"
对string对象s1和字符数组s2进行访问:s1[0],s2[0]
s1[0]
和s2[0]
虽然看上去相似,但是底层实现原理不同
s1[0]
实际上是运算符重载s1.operator[](0)
s2[0]
是指针的解引用*(s2+0)
at
char& at (size_t pos);
const char& at (size_t pos) const;
at
函数和operatro[]
相似,都是返回pos
位置的字符的引用
void test4()
{string s("123");cout << s.at(0) << s.at(1) << s.at(2) << endl;
}
与operator[]的区别在于如果越界,at
会抛异常
但是at函数我们很少用,对于访问字符串元素,我们operator[]用的多
back和front
char& back();
const char& back() const;char& front();
const char& front() const;
back()
返回字符串中最后一个字符的引用front()
返回字符串中第一个字符的引用back
和front
都有可以支持读写和只读的2个函数- 空字符串不可以调用这2个函数
back
和front
是C++11中才出现的- 这2个函数不常用,完全可以用
operatro[]
替代
迭代器iterator
迭代器iterator
的作用是用来访问容器中的元素,不同的容器有属于自己的指针,迭代器像指针一样,但不一定是指针
在string容器中,迭代器是指针
迭代器iterator提供了一种统一的方式访问和修改容器的数据
- 普通迭代器:
begin()
,end()
beign()指向字符串的第一个字符
end()指向字符串的最后一个字符的下一个位置
所以我们又有了一种可以遍历字符串的方法,就是使用迭代器
void test5()
{string s("hello world!");string::iterator it = s.begin();while (it != s.end()){cout << *it;it++;}
}
- 反向迭代器: rbegin(),rend()
rbegin()指向最后一个元素,rend()指向第一个元素的下一个元素
反向迭代器的类型是string::reverse_iterator
string::reverse_iterator rit = s.rbegin
前面的类型写起来太长,我们可以用auto
替代:auto rit = s.rbegin
void test5()
{string s("hello world!");auto rit = s.rbegin();while (rit != s.rend()){cout << *rit;rit++;}
}
- const迭代器
如果用普通类型的迭代器去接收const类型字符串的迭代器会报错
所以这里还有一种const迭代器,有四种:cbegin()
,cend()
,crbegin()
,crend()
普通迭代器可读可写,const迭代器只能写
const string s("hello wolrd");
string::const_iterator cit1= s1.cbegin();
string::const_iterator cit2= s1.cend();
string::const_reverse_iterator crit1 = s1.crbegin()
string::const_reverse_iterator crit2 = s1.crend()
const迭代器是C++11中定义的
容量操作
size()和length()
size()和length()都返回字符串有效长度
在string类中,不把最后的
\0
认为是有效长度,计算\0
前面字符串的长度
2个函数作用是一样的,那么底层实现是一样的吗?
我们先转到库文件里看看源码
_NODISCARD _CONSTEXPR20_CONTAINER size_type length() const noexcept {return _Mypair._Myval2._Mysize;
}_NODISCARD _CONSTEXPR20_CONTAINER size_type size() const noexcept {return _Mypair._Myval2._Mysize;
}
可以看到,2个函数的源码是相同的,那么为什么要定义2个作用一样的函数呢?
原因是,length()
是从C语言中延续过来的
在有STL后,用length表示其他容器的大小不是特别确切,于是用size()
函数返回容器的大小
为了兼容STL中的size()
函数,所以在string中也定义了一个size()
capacity()
string类中是有capacity的,类似于顺序表,因为string需要扩容
capacity()
的作用就是返回capacity
max_size
max_size()
返回字符串最大尺度,但是在不同环境,不同平台下,max_size()
返回的值不同
所以max_size(0
很少用
clear
clear
清空有效字符,使size
为0,capacity
不变
empty
判断字符串是否为空串
如果是空串返回true
,否则返回false
reserve
void reserve (size_t n = 0);
reserve
作用是改变capacity
纯开空间,不会改变size
如果我们知道某一字符串需要多大的空间,那么就可以直接用reserve
扩容那么大的空间,就不需要多次扩容了,减少了扩容时的消耗
n
如果大于现有的容量,就会使capacity
扩大到n
(或者更大,这取决于编译器)
n
如果小于现有的容量,缩小字符串容量是非约束性条件,容量是否缩小取决于平台和编译器
void test6()
{string s("hello world");cout << s.size() << endl;cout << s.capacity() << endl;s.reserve(20);cout << "s.reserve(20)" << endl;cout << s.size() << endl;cout << s.capacity() << endl;s.reserve(5);cout << "s.reserve(5)" << endl;cout << s.size() << endl;cout << s.capacity() << endl;
}
从上面的输出结果可以看出,reserve(20)
最终被编译器处理,扩容到了31,编译器也没有处理reserve(5)
的缩容量要求
在string中,capacity认为是有效字符容量,所以字符串结尾的
\0
不算在其中
s.reserve(n)
表面上是把容量阔为n
,但是底层是扩大为n+1
大小,就是为了容纳结尾的\0
resize
void resize (size_t n);
void resize (size_t n, char c);
resize改变
如果n比size
小,就把字符串缩短到前 n 个字符,并删除 n 字符以外的字符,不会是capacity减小。
如果n比size大,则在字符串末尾插入所需的字符来扩展当前内容默认填充'\0
,以达到 n 的大小。如果指定了 c,则新元素将被初始化为c 。在这个过程中如果容量满了,还会进行扩容
void test7()
{string s("hello world");cout << s.size() << endl;cout << s.capacity() << endl;s.resize(3);cout << s << endl;cout << s.size() << endl;cout << s.capacity() << endl;s.resize(20,'x');cout << s << endl;cout << s.size() << endl;cout << s.capacity() << endl;
}
shrink_to_fit
要求字符串缩小容量,以适应其大小。
该请求是非约束性的,容器实现可以自由地进行其他优化,使字符串的容量大于其大小,是否减小capacity取决于编译器
此函数不会影响字符串的长度,也不会改变其内容。
shrink_to_fit
是C++11中才有的
string类对象修改操作
operator+=
string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c);
operator+=
的作用是在字符串后面追加一个字符串或字符
string& operator+= (const string& str)
和string& operator+= (const char* s)
是追加字符串
string& operator+= (char c)
是追加一个字符
void test8()
{string s1("hello");string s2(" world");s1 += s2;//追加一个string对象cout << s1 << endl;s1 += " hello string";//追加一个字符串cout << s1 << endl;s1 += '!';//追加一个字符cout << s1 << endl;
}
push_back
void push_back (char c);
作用是在字符串后追加一个字符
void test8()
{string s1("hello world");s1.push_back('!');cout<<s1<<endl;
}
结果输出:hello world!
append
作用是在字符串后面追加一个字符串
我们可以看到append
重载了6种函数,我们可以通过参数判断出函数的用法,其实和构造函数是相同的
string& append (const string& str)
,在字符串后追加strstring& append (const string& str, size_t subpos, size_t sublen)
,在str的subpos位置开始,追加sublen长度的字符串string& append (const char* s)
,追加字符串sstring& append (const char* s, size_t n
,追加字符串s的前n个字符string& append (size_t n, char c)
,连续追加n个字符ctemplate <class InputIterator> string& append (InputIterator first, InputIterator last);
按顺序添加 [first,last] 范围内字符序列
void test9()
{string s1;string s2(" world");s1.append("hello");//hellos1.append(s2);//hello worldstring s3;s3.append(s2, 2, 5);//llo ws3.append(5, 'x');//llo wxxxxxs3.append("string", 4);//llo wxxxxxstris3.append(s1.begin(), s1.end());//llo wxxxxxstrihello world
}
assign
为字符串赋值,替换当前内容
根据参数我们也可以看出每个函数的用法,与构造函数和append函数类似
assign我们用的少,它的特点就是赋值+覆盖
void test10()
{std::string str;std::string base = "The quick brown fox jumps over a lazy dog.";str.assign(base);std::cout << str << '\n'; //"The quick brown fox jumps over a lazy dog."str.assign(base, 10, 9);std::cout << str << '\n'; // "brown fox"str.assign("pangrams are cool", 7);std::cout << str << '\n'; // "pangram"str.assign("c-string");std::cout << str << '\n'; // "c-string"str.assign(10, '*');std::cout << str << '\n'; // "**********"str.assign(base.begin() + 16, base.end() - 12);std::cout << str << '\n'; // "fox jumps over"
}
insert
在pos位置或迭代器p位置处字符前插入附加字符串
void test11()
{string str = "to be question";string str2 = "the ";string str3 = "or not to be";string::iterator it;str.insert(6, str2); // to be the questionstr.insert(6, str3, 3, 4); // to be not the questionstr.insert(10, "that is cool", 8); // to be not that is the questionstr.insert(10, "to be "); // to be not to be that is the questionstr.insert(15, 1, ':'); // to be not to be: that is the questionit = str.insert(str.begin() + 5, ','); // to be, not to be: that is the questionstr.insert(str.end(), 3, '.'); // to be, not to be: that is the question...
}
erase
string& erase (size_t pos = 0, size_t len = npos);
iterator erase (iterator p);
iterator erase (iterator first, iterator last);
- string& erase (size_t pos = 0, size_t len = npos),删除字符串中从字符位置 pos 开始并跨越 len 字符的部分,参数pos和len都是缺省参数,如果都传参,就会将字符串全部删除
- iterator erase (iterator p),删除迭代器p位置处的字符
- iterator erase (iterator first, iterator last),删除[first,last]区间中的字符部分
replace
用新内容替换字符串中从字符 pos 开始、跨 len 字符的部分(迭代器[i1,i2]区间字符的部分)
void test12()
{std::string base = "this is a test string.";std::string str2 = "n example";std::string str3 = "sample phrase";std::string str4 = "useful.";//0123456789*123456789*12345std::string str = base; // "this is a test string."str.replace(9, 5, str2); // "this is an example string." str.replace(19, 6, str3, 7, 6); // "this is an example phrase." str.replace(8, 10, "just a"); // "this is just a phrase." str.replace(8, 6, "a shorty", 7); // "this is a short phrase." str.replace(22, 1, 3, '!'); // "this is a short phrase!!!"
}
swap
void swap (string& str);
交换2个字符串的值
void test13()
{string s1("hello world");string s2("let`s rock");s1.swap(s2);cout << s1 << endl;//let`s rockcout << s2 << endl;//hello world
}
pop_back
void pop_back();
删除最后一个元素
void test13()
{string s1("hello world");s1.pop_back();cout << s1; //“hello worl”
}
字符串操作
c_str
const char* c_str() const;
获取等价C的字符串
返回一个指针,指针指向一个字符串
void test14()
{string s("let`s rock");const char* str = s.c_str();cout << str;//"let`s rock"
}
substr
string substr (size_t pos = 0, size_t len = npos) const;
返回子串
子串是对象中从字符位置 pos 开始、跨 len 字符(或直到字符串结束,以先到者为准)的部分。
find和rfind
find
在字符串中搜索参数指定序列的首次出现,如果找到了指定序列,返回指定序列首次出现的位置,如果没找到,返回npos
如果指定了 pos,只从pos位置开始(包括pos)向后进行搜索
参数n 指的是查找字符串前n个字符
下面我们划分一个网址的协议,域名,资源
void test16()
{string url("https://blog.csdn.net/weixin_64116522?spm=1000.2115.3001.5343");size_t pos1 = url.find("://");if (pos1 != string::npos){string protocol = url.substr(0,pos1);cout << protocol << endl;}size_t pos2 = url.find("/", pos1 + 3);if (pos2 != string::npos){string domain = url.substr(pos1 + 3, pos2 - (pos1 + 3));cout << domain <<endl;string uri = url.substr(pos2 + 1);cout << uri << endl;}
}
我们先从头开始搜索":\\"
,把找到的位置存放到pos1
中,然后用substr函数提取处协议字串propocol
然后我们就要从blog.csdn.net/weixin_64116522?spm=1000.2115.3001.5343
里面搜索/
,也就是从pos1+3
位置开始搜索,把找到的位置存放到pos2
中,使用substr函数,从pos1+3位置开始,提取长度为pos2 - (pos1 + 3)
的字串就是域名,剩下的就是资源了
rfind
在字符串中查找参数指定序列的最后一次出现。
如果指定了 pos,则搜索只包括从 pos 位置或之前开始的字符序列,而忽略从 pos 位置之后开始的任何可能的匹配。
find_first_of,find_last_of,find_first_not_of,find_last_not_of
size_t find_first_of (const string& str, size_t pos = 0) const;size_t find_first_of (const char* s, size_t pos = 0) const;size_t find_first_of (const char* s, size_t pos, size_t n) const;size_t find_first_of (char c, size_t pos = 0) const;size_t find_last_of (const string& str, size_t pos = npos) const;size_t find_last_of (const char* s, size_t pos = npos) const;size_t find_last_of (const char* s, size_t pos, size_t n) const;size_t find_last_of (char c, size_t pos = npos) const;
find_first_of
搜索字符串中与其参数中指定的任何字符相匹配的第一个字符。
如果指定了 pos,则搜索只包括 pos 位置上或之后的字符,而忽略 pos 之前可能出现的任何字符。
find_last_of
搜索字符串中与参数中指定的任何字符相匹配的最后一个字符。
如果指定了 pos,则搜索只包括 pos 位置或之前的字符,忽略 pos 之后可能出现的字符。
void test17()
{string str("helloiqa");size_t pos1 = str.find_first_of("aeiou");//返回"aeiou"中任一个字符在str中第一次出现的位置,第一次出现的是e,位置是1cout << pos1 << endl;size_t pos2 = str.find_last_of("aeiou");//返回"aeiou"中任一个字符在str中最后一次出现的位置,最后一次出现的是a,位置是7cout << pos2 << endl;
}
size_t find_first_not_of (const string& str, size_t pos = 0) const;size_t find_first_not_of (const char* s, size_t pos = 0) const;size_t find_first_not_of (const char* s, size_t pos, size_t n) const;size_t find_first_not_of (char c, size_t pos = 0) const;size_t find_last_not_of (const string& str, size_t pos = npos) const;size_t find_last_not_of (const char* s, size_t pos = npos) const;size_t find_last_not_of (const char* s, size_t pos, size_t n) const;size_t find_last_not_of (char c, size_t pos = npos) const;
find_first_not_of
搜索字符串中第一个不匹配参数中指定字符的字符。
如果指定了 pos,则搜索只包括位置 pos 上或之后的字符,而忽略该字符之前可能出现的任何字符。
find_last_not_of
搜索字符串中最后一个不匹配参数中指定字符的字符。
如果指定了 pos,则搜索只包括 pos 位置或之前的字符,忽略 pos 之后可能出现的字符。
void test17()
{string str("helloiqa");size_t pos1 = str.find_first_not_of("aeiou");//返回第一个不匹配"aeiou"中指定字符的字符,是h,位置为0cout << pos1 << endl;size_t pos2 = str.find_last_not_of("aeiou");//返回最后一个不匹配"aeiou"中指定字符的字符,是q,位置为6cout << pos2 << endl;
}
非成员重载函数
关系操作符
比较大小,这里不多说
流插入,流提取
string也重载了operator<<和operator>>
流提取就是输出字符串
void test18()
{string str("hello");cout<<str;//流提取运算符
}
流插入运算符
void test18()
{string str;cin>>str;//流提取运算符
}
这里有一个问题,如果输入一个连续的字符串,可以成功得从缓冲区中读取到
如果输入一个字符串中间有空格,就只会读取到空间前的部分
这时就需要用到getline函数了
getline
istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);
getline(cin,s)
,这样就可以读取到空格后面的字符串了
类型转换函数
string类中还内置一些类型转换函数
VS下string的结构
string总共占28字节,内部结构是比较复杂的
有一个联合体,联合体用来定义string中字符串的存储空间
- 当字符串长度小于16时,使用内部固定的字符数组存放
- 当字符串长度大于16时,从堆上开空间,只在联合体内存放一个指向堆空间的指针
- 这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高
- 还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
相关文章:

C++ string 的用法
目录 string类string类接口函数及基本用法构造函数,析构函数及赋值重载函数元素访问相关函数operator[]atback和front 迭代器iterator容量操作size()和length()capacity()max_sizeclearemptyreserveresizeshrink_to_fit string类对象修改操作operatorpush_backappen…...
MyBatis-Flex学习记录1---请各位大神指教
简介(官网介绍) MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper帮助我们极大的减少了 SQL 编写的工作的同时&…...
二分查找旋转数组
已知整数数组nums,先按升序排序后,再旋转。旋转k位后,元素分别为nums[k],nums[k1]...nums[0]...nums[k-1]。请查找target 是否存在,如果存在返回所在索引;否则返回-1。假定nums没有重复的元素。 假定排序后的数组为{1…...
关于3D位姿旋转
一. 主动旋转和被动旋转 1. active rotation 主动旋转 站在坐标系的位置看旋转目标物:目标物主动发生旋转。 2. passive rotation 被动旋转 站在旋转目标物的位置看坐标系: 坐标系发生旋转,相当于目标物在坐标系内的位置被动地发生了旋转…...

解锁项目成功的关键:项目经理的结构化思维之道
1. 项目经理的核心职责 作为项目经理,我们的工作不仅仅是跟踪进度和管理团队。我们的角色在整个项目生命周期中都是至关重要的,从初始概念到最终交付。以下是项目经理的几个核心职责: 确保项目目标的清晰性项目的成功在很大程度上取决于其目…...

力扣974被K整除的子数组
同余定理 使用前缀和哈希表 由于可能是负数所以要进行修正:(sum%kk)%k class Solution { public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int,int> hash;hash[0 % k] 1; //0 这个数的余数int sum 0, ret 0;for(auto x…...

简单认识Docker数据管理
文章目录 为何需要docker数据管理数据管理类型 一、数据卷二、数据卷容器三、容器互联 为何需要docker数据管理 因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在…...

UDP数据报结构分析(面试重点)
在传输层中有UDP和TCP两个重要的协议,下面将针对UDP数据报的结构进行分析 UDP结构图示 UDP报头结构的分析 UDP报头有4个属性,分别是源端口,目的端口,UDP报文长度,校验和,它们都占16位2个字节,所…...

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)二(113)
需求: 有一个List<Map<String.Object>>,存储了区域的数据, 数据是根据用户查询条件进行显示的;所以查询的数据是动态的;按区域维度统计每个区域出现的次数,并且按照次数的大小排序(升序&#…...

C++进阶 类型转换
本文简介:介绍C中类型转换的方式 类型转换 C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_cast RTTI(了解)总结 C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型…...

Idea中隐藏指定文件或指定类型文件
Setting ->Editor ->Code Style->File Types → Ignored Files and Folders输入要隐藏的文件名,支持*号通配符回车确认添加...

第2步---MySQL卸载和图形化工具展示
第2步---MySQL卸载和图形化工具展示 1.MySQL的卸载 2.MySQL的图形化工具 2.1常见的图形化工具 SQLyog:简单。SQLyog首页、文档和下载 - MySQL 客户端工具 - OSCHINA - 中文开源技术交流社区 Mysql Workbench :MySQL :: MySQL Workbench DataGrip&…...
原型和原型链
好久没记了有点忘记了,来记录一下。 1、函数和对象的关系:对象都是通过函数创建的,函数也是一个对象。 2、原型和原型链 1.原型:原型分为两种 prototype:每一个函数都会有prototype属性,它指向函数的原型…...

解决ios隔空播放音频到macos没有声音的问题
解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…...

LTPP在线开发平台【使用教程】
LTPP在线开发平台 点击访问 LTPP在线开发平台 LTPP(Learning teaching practice platform)在线开发平台是一个编程学习网站,该网站集文章学习、短视频、在线直播、代码训练、在线问答、在线聊天和在线商店于一体,专注于提升用户编…...
0818 新增码表 git拉取代码
目的是新增两个码表字段。然后和前端联调。 use db; delete from sys_dict_data where dict_type res_switch_status; INSERT INTO sys_dict_data VALUES (0, 1, 已接入, 1, res_switch_status, NULL, default, N, 0, , 2022-07-26 10:43:41, , NULL, NULL); INSERT INTO sys…...

AI 绘画Stable Diffusion 研究(十)sd图生图功能详解-精美二维码的制作
免责声明: 本案例所用安装包免费提供,无任何盈利目的。 大家好,我是风雨无阻。 为了让大家更直观的了解图生图功能,明白图生图功能到底是干嘛的,能做什么事情?今天我们继续介绍图生图的实用案例-精美二维码的制作。 对…...
C# File.ReadAllLines()报错
项目中需要读取一个文本文件的内容,调用C#的File.ReadAllLines(path)方法,但是报错,就提示unknown exception,也没其他提示了。 文件是在的,并且,如果把文件拷贝到另外一个路径,再次读取是正常…...

LeetCode 1162. As Far from Land as Possible【多源BFS】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

【算法】二分查找(整数二分和浮点数二分)
二分查找也称折半查找(Binary Search),是一种效率较高的查找方法,时间复杂度为O(logN)。 二分查找采用了“分治”策略。使用二分查找时,数组中的元素之间得有单调性(升序或者降序)。 二分的模…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...