女生做网站后期维护工作好吗,公司体系建设的意义,品牌营销策划案例ppt,郴州网约车平台有哪些一.string类
1.1为什么学习string类#xff1f; C 语言中#xff0c;字符串是以 \0 结尾的一些字符的集合#xff0c;为了操作方便#xff0c; C 标准库中提供了一些 str 系列的库函数#xff0c;但是这些库函数与字符串是分离开的#xff0c;不太符合OOP 的思想#x…一.string类
1.1为什么学习string类 C 语言中字符串是以 \0 结尾的一些字符的集合为了操作方便 C 标准库中提供了一些 str 系列的库函数但是这些库函数与字符串是分离开的不太符合OOP 的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。 在 OJ 中有关字符串的题目基本以 string 类的形式出现而且在常规工作中为了简单、方便、快捷基本 都使用string 类很少有人去使用 C 库中的字符串操作函数。 1.2.标准库中的string类 string类的文档介绍 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作 单字节字符字符串的设计特性。 3. string 类是使用 char( 即作为它的字符类型使用它的默认 char_traits 和分配器类型 ( 关于模板的更多信 息请参阅basic_string) 。 4. string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 5. 注意这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( 如 UTF-8) 的序列这个 类的所有成员( 如长度或大小 ) 以及它的迭代器将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。 总结 1. string 是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同再添加了一些专门用来操作 string 的常规操作。 3. string 在底层实际是 basic_string 模板类的别名 typedef basic_stringchar, char_traits, allocator string; 4. 不能操作多字节或者变长字符的序列。 在 使用string类时必须包含#include头文件以及using namespace std; 二.string对象的元素访问 2.1.1使用operator[]与at实现访问 #includeiostream
#includestring
using namespace std;int main()
{string s(hello);//构造for (size_t i 0; i s.size(); i)//读{cout s[i] ;}cout endl;for (size_t i 0; i s.size(); i){cout s.at(i) ;}cout endl;for (size_t i 0; i s.size(); i)//写at同理{cout s[i]1 ;}} operator[]与at的区别 operator[]在元素越界访问时采用断言at采用抛出异常 2.1.2正向迭代器访问 #includeiostream
#includestring
using namespace std;int main()
{string s(hello C);string::iterator it s.begin();while (it ! s.end())//读{cout *it ;it;}cout endl;it s.begin();while (it ! s.end())//写{*it 1;cout *it ;}cout endl;return 0;
} 2.1.3反向迭代器访问 #includeiostream
#includestring
using namespace std;int main()
{string s(hello C);string::reverse_iterator it s.rbegin();while (it ! s.rend())//读{cout *it ;it;}cout endl;it s.rbegin();while (it ! s.rend())//写{*it 1;cout *it ;}cout endl;return 0;
} 2.1.4const正向迭代器不能修改 #includeiostream
#includestring
using namespace std;int main()
{string s(hello C);string::const_iterator it s.begin();while (it ! s.end())//读{cout *it ;it;}cout endl;return 0;
} 2.1.5const反向迭代器不能修改 #includeiostream
#includestring
using namespace std;int main()
{string s(hello C);string::const_reverse_iterator it s.rbegin();while (it ! s.rend())//读{cout *it ;it;}cout endl;return 0;
} 2.1.6范围for #includeiostream
#includestring
using namespace std;int main()
{string s(hello C);for(auto ch:s)//无法修改{coutch ;}for(auto ch:s)//可以修改{ch1;coutch ;}return 0;
} 三.string类对象的常见构造 string() 重点无参构造函数string(const char* s) 重点用字符串构造对象string(size_t n,char c) 重点用n个字符构造对象string(const string s) 重点拷贝构造string(const string str,size_t pos,size_t lennpos)用str从下标包括之后len长度的内容构造对象string(const char* s,size_t n)用字符串前n个构造对象 template class InputIterator first,InputIterator last string(InputIterator first,InputIterator last) 迭代器区间构造对象 注第四个构造方法中的npos是string类中的一个被static修是的类型为size_t(无符号整形)值为-1 #includeiostream
#includestring
using namespace std;int main()
{string s1;//无参构造string s2(abcdefg);//用字符串构造对象string s3(5, s);//string类对象中包含n个字符string s4(s2);//拷贝构造string s5(s2, 0, 3);//用str从下标包括之后len长度的内容构造对象string s6(abcdefg, 3);//用字符串前n个构造对象string s7(s6.begin(), s6.end());//迭代器区间构造对象cout s1 s1 endl;cout s2 s2 endl;cout s3 s3 endl;cout s4 s4 endl;cout s5 s5 endl;cout s6 s6 endl;cout s7 s7 endl;return 0;
} 三. string类对象的容量操作 size (重点)返回字串有效字符长度length返回字符串有效长度capacity 返回空间总大小empty (重点)检测字符串是否为空串是返回true,否则返回falseclear (重点)清空有效字符reserve (重点)为字符串预留空间resize (重点)将有效字符个数改成n个多出的空间用字符c填充 1.reverse(修改总容量) #includeiostream
#includestring
using namespace std;int main()
{string s(hello C);cout s.size() s.capacity() endl;s.reserve(100);cout s.size() s.capacity() endl;s.reserve(10);cout s.size() s.capacity() endl;return 0;
} reserve用于预开空间如果开辟的空间小于原空间并不会改变容量 2.resize(调整size) #includeiostream
#includestring
using namespace std;int main()
{//resize(n)// resize(size_t n,char x)//分三种情况//1. nsize//2. nsize ncapacity//3. ncapacitystring s(hello world);s.resize(10);//cout s.size() s.capacity() sendl;s.resize(17);//将size改为17多出来的用\0填充cout s.size() s.capacity() sendl;s.resize(40, x);//将size改为40多出来的位置用x填充cout s.size() s.capacity() sendl;return 0;
} resize用于调整size当n大于容量是会扩容并用对于的字符填充。 当nsize n 容量时用对应的字符填充多出来的 当nsize 时会缩容放弃超过的空间。 注意 1. size() 与 length() 方法底层实现原理完全相同引入 size() 的原因是为了与其他容器的接口保持一 致一般情况下基本都是用 size() 。 2. clear() 只是将 string 中有效字符清空不改变底层空间大小。 3. resize(size_t n) 与 resize(size_t n, char c) 都是将字符串中有效字符个数改变到 n 个不同的是当字 符个数增多时resize(n) 用 0 来填充多出的元素空间 resize(size_t n, char c) 用字符 c 来填充多出的 元素空间。注意resize 在改变元素个数时如果是将元素个数增多可能会改变底层容量的大 小如果是将元素个数减少底层空间总大小不变。 4. reserve(size_t res_arg0) 为 string 预留空间不改变有效元素个数当 reserve 的参数小于 string的底层空间总大小时 reserver 不会改变容量大小。 四. string类对象的修改操作 push_back 在字符串后尾插字符c append 在字符串后追加一个字符串 operator ( 重点) 在字符串后追加字符串 str c_str ( 重点 ) 返回 C 格式字符串 find npos ( 重点 ) 从字符串 pos 位置开始往后找字符 c 返回该字符在字符串中的位置 rfind 从字符串 pos 位置开始往前找字符 c 返回该字符在字符串中的位置 substr 在 str 中从 pos 位置开始截取 n 个字符然后将其返回 find //从pos位置开始找str
size_t find (const string str, size_t pos 0) const noexcept;//从pos位置开始找字符串第一次出现的下标若不存在返回npos
size_t find (const char* s, size_t pos 0) const;//从pos位置找字符串s的前n个第一次出现的下标不存在返回npos
size_t find (const char* s, size_t pos, size_type n) const;size_t find (char c, size_t pos 0) const noexcept; 通常finf与substr配合使用对找一个网址对应的协议域名地址 #includeiostream
#includestring
using namespace std;int main()
{
//string s3(https://legacy.cplusplus.com/reference/string/string/rfind/);string s3(ftp://www.baidu.com/?tn65081411_1_oem_dg);// 协议// 域名// 资源名string sub1, sub2, sub3;size_t i1 s3.find(:);if (i1 ! string::npos)sub1 s3.substr(0, i1);//查找协议elsecout 没有找到i1 endl;size_t i2 s3.find(/, i13);if (i2 ! string::npos)sub2 s3.substr(i13, i2-(i13));//查找域名elsecout 没有找到i2 endl;sub3 s3.substr(i2 1);//查找地址cout sub1 endl;cout sub2 endl;cout sub3 endl;
} 五.string类非成员函数 operator 尽量少用因为传值返回导致深拷贝效率低 operator 重点 输入运算符重载 operator 重点 输出运算符重载 getline 重点 获取一行字符串 流提取不能接受空格和换行需要用接受带有空格的字符串时可以用getline getline istream getline(istream in, stringstr, char delim);//从流提取中提取字符串到str中直到delim或\nistream getline(istream in,string str, char);//从流提取中取字符串到str 六.将string对象int互相转换 6.1stoi 将string里第一次遇到的数字字符转换成int 将一个string对象转化成int类型的数字 idx不传参为nullptr表示不使用这个参数反之idx指向string对象数字字符的后一个位置 6.2, to_string 将数字转化成string对象