网站做相册,用r做简易的网站,企业电话名单从哪里弄,搜索引擎的四个组成部分及作用#x1f525;博客主页#xff1a;小王又困了
#x1f4da;系列专栏#xff1a;C
#x1f31f;人之为学#xff0c;不日近则日退
❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 目录
一、string类介绍
二、string类的常用接口说明
#x1f4d2;2.1string类对象的常…
博客主页小王又困了
系列专栏C
人之为学不日近则日退
❤️感谢大家点赞收藏⭐评论✍️ 目录
一、string类介绍
二、string类的常用接口说明
2.1string类对象的常见构造
2.2string类对象的容量操作
2.3string类对象的访问及遍历操作
2.4string类对象的修改操作
编辑
2.5string类对象的查找接口
2.6string类非成员函数 ️前言 C语言中字符串是以\0结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数 但是这些库函数与字符串是分离开的不太符合OOP的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。C中引入了string类给我们提供了便利。 一、string类介绍
string是表示字符串的字符串类 string类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。string在底层实际是basic_string模板类的别名typedef basic_string string;。不能操作多字节或者变长字符的序列。
小Tips在使用string类时必须包含#include头文件以及using namespace std;。
二、string类的常用接口说明
2.1string类对象的常见构造 string() 构造空的string类对象即空字符串。 int main()
{string s1;cout s1 endl;return 0;
} string(const char* s) 用一个C的字符串或字符数组来构造一个string类的对象。 int main()
{string s1(hellow world);cout s1 endl;return 0;
}string(size_t n, char c) 用 n 个字符来构建string类对象。 int main()
{string s1(5, x);cout s1 endl;return 0;
} string(const strings) string类的拷贝构造用于构建一个和存在的s1一模一样的对象。 int main()
{string s1(5, x);string s2(s1);cout s2 endl;return 0;
} string(const string strsize_t possize_t lennpos) 复制str从pos位置开始len个字符的部分使用一个已存在的string类对象的一部分来创建一个新的string类对象。 小Tipsnops是string类里面的一个静态成员变量它是size_t类型初始化为-1即表示整型的最大值。 int main()
{string s1(hellow world);string s2(s1, 7, 5);cout s2 endl;return 0;
} string(const char* ssize_t n) 用 s 所指向字符串或字符数组的前 n 个字符来初始化创建一个string类对象。 int main()
{char s[] hellow ,world;string s1(s, 6);cout s1 endl;return 0;
} 2.2string类对象的容量操作 size() 返回字符串有效字符长度 int main()
{string s1(hellow world);string s2(hellow C);cout s1.size() endl;cout s2.size() endl;return 0;
} length() 返回字符串有效字符长度 int main()
{string s1(hellow world);string s2(hellow C);cout s1.length() endl;cout s2.length() endl;return 0;
} 小Tipssize()与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()。 capacity() 返回string对象空间的总大小。 int main()
{string s1(hellow world);string s2(hellow world xxxxxxx);cout s1.capacity() endl;cout s2.capacity() endl;return 0;
} 小Tipscapacity()会返回对象空间的总大小这个空间是存储有效字符的空间实际上会多开辟一个空间存储‘\0’。同一个对象在不同的环境开辟的空间不同在不同环境下扩容机制也不同。 VS下的扩容机制 int main()
{string s1(hellow world);size_t old s1.capacity();cout old endl;for (size_t i 0; i 100; i){s1.push_back(x);if (old ! s1.capacity()){cout s1.capacity() endl;old s1.capacity();}}return 0;
} VS下默认开辟15个空间用来存储数据本质上是开16个空间因为还要存‘/0’第一次扩容是2倍后面都是以1.5倍的大小去扩容。 Linux下的扩容机制 在Linux环境下最初对象需要多少空间就开多少后面一次按照2倍的大小进行扩容。 reserve(size_t n 0) 为字符串预留空间。直接一次开辟n个空间可以用来存储n个有效字符可以避免每次都要去扩容。 int main()
{string s1(hellow world);s1.reserve(100);size_t old s1.capacity();cout s1.capacity() endl;for (size_t i 0; i 100; i){s1.push_back(x);if (old ! s1.capacity()){cout s1.capacity() endl;old s1.capacity();}}return 0;
} 小Tips当我们确定需要多少空间就可以使用reserve()提前开辟好空间即可可以减少扩容次数 大部分的扩容都是异地扩容扩容次数过多会影响效率。 resize(size_t n 0, char c) resize(size_t n)与resize(size_t n, char c)都是将字符串中有效字符个数改变到n个当n小于当前字符串的长度size()会保留前n个字符将第n个字符后面的所以字符删除当n大于当前字符串的长度size()先会进行扩容不同的是当字符个数增多时resize(size_t n)用‘\0’来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间。 int main()
{string s1(hellow world);cout s1 endl;cout s1.size() endl;cout s1.capacity() endl;s1.resize(100,x);cout s1 endl;cout s1.size() endl;cout s1.capacity() endl;return 0;
} 小Tipsresize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变。 reserve只会影响容量不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小,即不会缩容。
reserve只影响容量不影响数据resize既影响容量也影响数据 clean() 清理有效字符不改变容量大小 int main()
{string s1(Hello C!);cout 清空之前的size: s1.size() endl;cout 清空之前的capacity: s1.capacity() endl;s1.clear();cout 清空之后的size: s1.size() endl;cout 清空之后的capacity: s1.capacity() endl;return 0;
} 小Tipsclear()只是将string中有效字符清空不改变底层空间大小。 2.3string类对象的访问及遍历操作 operator() 返回pos位置的字符 int main()
{string s1 hellow world;for (size_t i 0; i s1.size(); i){cout s1[i];}cout endl;return 0;
} 小Tips如果字符串是const限定的则该函数返回const char。否则它将返回char。at借口与operator[]借口功能类型operator[]接口发生越界访问程序会直接报错at接口发生越界访问的时候会抛出异常。 begin、end/rebegin、rend begin获取对象第一个字符的迭代器end获取对象最后一个字符下一个位置的迭代器 int main()
{string s1 hellow world;string::iterator it s1.begin();while (it s1.end()){cout *it;it;}cout endl;string::reverse_iterator it s1.rbegin();//反向迭代器while (it s1.rend()){cout *it;it;}cout endl;return 0;
}如上代码我们看到迭代器和指针的使用方法类似都可以解引用和对象也可以修改。但迭代器的这些操作都是通过运算符重载来实现的。 小Tips迭代器区间永远都是左闭右开迭代器类型作为类的内置类型可以通过类名::itertator直接访问例如string::itertator就表示string类里面的迭代器类型。普通迭代器可读可写const迭代器限制的是其指向的内容只能读不能写而const迭代器本身可以修改。 范围for int main()
{string s1(Hello world);for (auto it : s1){cout it;}cout endl;return 0;
}小Tips范围for就是基于迭代器实现的在底层范围for会转化成正向迭代器。 2.4string类对象的修改操作 push back 在字符串后尾插字符c int main()
{string s1(Hello world);cout 追加前: s1 endl;s1.push_back(x);cout 追加后: s1 endl;return 0;
} append 在字符串后追加一个字符串它有六种重载形式如下图所示 int main()
{string s1(Hello world);cout 追加前: s1 endl;s1.append(xxxxxxx);cout 追加后: s1 endl;string s2 abcdefg;cout 追加前: s1 endl;s1.append(s2, 2, 4);cout 追加后: s1 endl;return 0;
} operator 通过重载运算符实现追加该运算符重载有三种重载实现形式如下图所示 int main()
{string s1(Hello world);cout 追加前: s1 endl;s1 xxxxxx;cout 追加后: s1 endl;string s3 abcdefg;string s2(Hello world);cout 追加前: s2 endl;s2 s3;cout 追加后: s2 endl;return 0;
} 小Tips在string尾部追加字符的三种方式中操作用的比较多操作不仅可以连接单个字符还可以连接字符串。
2.5string类对象的查找接口 find 从字符串的pos位置开始往后查找字符或字符串返回其在当前字符串中的位置。 int main()
{string s1 hellow world;string s2 world;size_t pos s1.find(s2);cout pos endl;return 0;
} substr 在str中从pos位置开始截取n个字符然后将其返回 int main()
{string s1 test.txt.cpp;size_t pos s1.rfind(.);if (pos ! string::npos){string s2 s1.substr(pos);cout s2 endl;}return 0;
} 2.6string类非成员函数
函数名称功能说明operator尽量少用因为传值返回导致深拷贝效率低operator输入运算符重载operator输出运算符重载getline获取一行字符串relational operators大小比较
小Tipsoperator和getline的区别在于前者遇到空格‘ ’和换行‘\n’会截止而后者默认只有遇到换行‘\n’才截止因此当我们需要从键盘读取一个含有空格的字符串是只能用getline。 结语 本次的内容到这里就结束啦。希望大家阅读完可以有所收获同时也感谢各位读者三连支持。文章有问题可以在评论区留言博主一定认真认真修改以后写出更好的文章。你们的支持就是博主最大的动力。