橘子建站,行业前10的网站建设公,外贸建站推广工作总结,seo企业网站模板要相信别人能做出来自己一定可以做出来#xff0c;只不过是时间没到而已
目录
#x1f6a9;string类对象capacity操作
#x1f4bb;reserve()保留 #x1f4bb;resize()
#x1f6a9;string类对象元素访问操作
#x1f4bb;operator[]和at()
#x1f4bb;operator…要相信别人能做出来自己一定可以做出来只不过是时间没到而已
目录
string类对象capacity操作
reserve()保留 resize()
string类对象元素访问操作
operator[]和at()
operator[]和at()函数有关越界访问 string类对象修饰语操作
assign()
insert()
erase()
replace()
replace()函数的应用
string类字符串操作
substr() 截取子字符串
find()函数
npos成员常量
find()和substr()函数结合使用
rfind()函数
find()和rfind()的区别
题目—字符串最后一个单词的长度
getline()
find_first_of()函数
find_last_of()函数
find_first_of()和find_last_of() 我们接着上一章的学习。
string类对象capacity操作 从上一章节介绍了size()和length()记录的是string类对象的字符串长度 max_size()指的是string类容纳的最大长度capacith指的是已分配存储的大小clear表示清空string类对象。
这里只限定在vs环境下不同的环境下的处理不同 reserve()保留 C中的reserve函数被广泛用于容器类中它的作用是预留一定量的内存空间来存储元素以提高程序的效率。这个函数只影响容器的capacity容量而不改变该容器包含的元素个数。使用reserve函数可以避免频繁的动态内存分配和释放减少内存碎片的产生以提高代码的效率。 resize()
c中resize函数是c标准库vector容器的一个成员函数用于改变vector的大小。它可以使vector变大或变小根据变化的大小它可能会在vector的末尾添加新元素或者从末尾删除元素。 第一个参数表示新的大小第二个可选参数表示插入的新值缺省为默认构造函数值可以是一个默认值也可以是一个可变参数模板包。 这里给字符串长度设置成200后面直接初始化成\0,capacity肯定是大于200的。 第二个函数不仅开空间而且 填值初始化为x。 再次调用resize()函数是不会改变capacity的值因为你想想开辟了200个字符的空间然后只需要20的空间剩下的180空间直接交给操作系统了那这样造成了极大的浪费一般我们都是拷贝那20空间给新的字符串然后free那剩下的空间。而不是这样直接丢弃编译器是不会允许你这样做的。所以capacity是不可改变的。
这里只限定在vs环境下不同的环境下的处理不同我们调用resize()函数至字符串长度为0capacity也是不改变的。 string类对象元素访问操作
operator[]和at int main()
{string s1(chenle);s1.at(0)z;cout s1 endl;s1[0] z;cout s1 endl;return 0;
} operator[]和at()函数有关越界访问
int main()
{string s1(chenle);s1.at(0)z;cout s1 endl;s1[0] z;cout s1 endl;s1[15];s1.at(15);return 0;
} at()函数越界抛异常 at()函数调用如果越界那么会抛异常用下面的格式就相对于调用operator[]函数相对温和一点的处理方式。
int main()
{try {string s1(hello world);s1.at(0) x;cout s1 endl;//s1[15]; // 暴力处理s1.at(15); // 温和的错误处理}catch (const exception e){cout e.what() endl;}return 0;
} string类对象修饰语操作 前面一篇文章我们讲了上面三个函数operator(),append(),push_back()。 assign() int main()
{string s1(chenle);s1 (xxxxxx);cout s1 endl;s1.assign(sssssss);cout s1 endl;return 0;
} insert() erase() int main()
{string s1(chenle);//删除第五个字符后面的一长度的字符s1.erase(5, 1);cout s1 endl;return 0;
} string s1(chenle);cout s1 endl;s1.erase(3);cout s1 endl;int main()
{string s2(hello world);/*s2.erase(0, 1);cout s2 endl;*///利用迭代器begin()函数那么删除begin()所指的当前位置的字符s2.erase(s2.begin());//参数不是迭代器是个数值那么删除第三个元素后面的所有字符s2.erase(3);cout s2 endl;return 0;
} replace() replace()函数的应用 int main()
{//将所有的空格都改成%20string s1(hello world hello bit);string s3;for (auto ch : s1){if (ch ! ){s3 ch;}else{s3 %20;}}s1 s3;cout s1 endl;return 0;
} string类字符串操作 substr() 截取子字符串 注意这里需要创建一个新的string对象被子字符串初始化因为截取字符串不改变原先的字符串。
int main()
{string s1(chenle zhangyaunfei);cout s1 endl;string s2;s2s1.substr(7, 12);cout s2 endl;return 0;
} find()函数 npos成员常量 这里我需要介绍一下npos
npos可以表示string的结束位子是string::type_size 类型的也就是find返回的类型。find函数在找不到指定值的情况下会返回string::npos。
这里我需要打印出这段网址中的协议http。我们想要找到://那么用string::npos如果find函数找不到://那么就返回string::npos。我们可以看到我们依次遍历找到了://,那么不返回string::nposif判断为真然后截取[0,pos1)字符串字段然后打印出。
int main()
{string url https://legacy.cplusplus.com/reference/string/string/;// 协议pos1 域名protocol 资源名size_t pos1 url.find(://);string protocol;if (pos1 ! string::npos){protocol url.substr(0, pos1);}cout protocol endl;return 0;
} 一个网址由三个部分组成协议域名资源名组成我们要分别打印出协议的部分域名的部分资源名的部分该如何使用find(),substr()函数呢 find()和substr()函数结合使用
int main()
{string url https://legacy.cplusplus.com/reference/string/string/;// 协议protocol 域名 资源名size_t pos1 url.find(://);string protocol;if (pos1 ! string::npos){protocol url.substr(0, pos1);}cout protocol endl;string domain;//域名string uri;//资源名size_t pos2 url.find(/, pos1 3);//从pos13位置开始找/if (pos2 ! string::npos){domain url.substr(pos13,pos2-(pos13));//从pos13的位置截取(pos2-(pos13))的长度读到遇到第一个/位置uri url.substr(pos2 1);//直接从pos21位置后读到最后即可}cout domain endl;cout uri endl;return 0;
} rfind()函数
逆向查字符或字符串若查找成功则返回逆向查到的第一个字符下标或第一个字符串首字符的下标若查找失败无法返回正确的下标。逆向查到的第一个字符或第一个字符串也就是正向的最后一个。rfind()函数的返回值为无符号整数类型。(rfind从后向前逆向查但匹配是正向匹配的可以参考下面代码多理解。)
str.rfind(“fab”,4);//从下标为4开始逆向查找正向匹配结果找不到返回npos。 str.find(“fab”);//如果没有第二个参数默认从下标npos开始。npos定义为保证大于任何有效下标的值。结果为5。 find()和rfind()的区别
#includeiostream
using namespace std;
int main()
{string strabcdefab;coutstr.find(a)endl;//正向找到返回有效下标0。coutstr.find(h)endl;//正向找不到,返回npos。coutstr.find(ab,1)endl;//正向找到并返回ab的首字母a下标6。coutstr.find(ab)endl;//没有第二个参数默认从0下标开始正向查找结果为0。正向查找正向匹配。coutstr.find(ha)endl;//正向找不到返回npos。coutstr.rfind(b)endl;//逆向找到并返回b的下标7。coutstr.rfind(h)endl;//逆向找不到,返回npos。coutstr.rfind(a,100)endl;//从下标100逆向查找,找到并返回a下标6。如果没有第二个参数默认从下标npos开始。npos定义为保证大于任何有效下标的值。//如果要设置rfind()的第二个参数那么一般情况下大于等于len-1就可以。coutstr.rfind(fab)endl;//逆向找到结果为5。coutstr.rfind(fab,4)endl;//逆向找不到返回npos。coutstr.rfind(fab,5)endl;//逆向可以找到结果为5。rfind从后向前逆向查但匹配是正向匹配的可以参考这个代码多理解。return 0;
}
//有效的下标应该在0~len-1范围内。lenstr.size(); 题目—字符串最后一个单词的长度 #include iostream
using namespace std;int main()
{string str1;// 不要使用cinline,因为会它遇到空格就结束了// while(cinline)while(getline(cin, str1)){size_t pos1str1.rfind( );coutstr1.size()-pos1-1endl;}return 0;
}
getline() 遇到这种情况我们用getline()这个非成员函数来进行操作 getline()函数读取一整行。 find_first_of()函数 int main()
{string str(Please, replace the vowels in this sentence by asterisks.);size_t found str.find_first_of(abc);while (found ! string::npos){str[found] *;//找到abc字符那么就改成*found str.find_first_of(abc, found 1);//继续从found后面一个字符开始找abc任意一个}cout str \n;return 0;
} find_last_of()函数 find_first_of()和find_last_of() 1、find_first_of()函数正向查找在原字符串中第一个与指定字符串或字符中的某个字符匹配的字符返回它的位置。若查找失败则返回npos。npos定义为保证大于任何有效下标的值。2、find_last_of()函数逆向查找在原字符串中最后一个与指定字符串或字符中的某个字符匹配的字符返回它的位置。若查找失败则返回npos。npos定义为保证大于任何有效下标的值。 #includeiostream
using namespace std;
int main()
{string strabcdefab;coutstr.find_first_of(a)endl;//第二个参数为0默认从下标为0开始查找。coutstr.find_first_of(hce)endl;//待查串hce第一个出现在原串str中的字符是c返回str中c的下标2,故结果为2。coutstr.find_first_of(ab,1)endl;//从下标为1开始查待查串ab第一个出现在原串str中的字符是b返回b的下标结果为1。coutstr.find_first_of(h)endl;//原串没有待查字符h故查不到返回npos。coutstr.find_first_of(hw)endl;//待查子串任一字符在原串中都找不到故查不到返回npos。coutstr.find_last_of(wab)endl;//原串最后一个字符首先与待查子串的每一个字符一一比较一旦有相同的就输出原串该字符的下标.。结果为b的下标7。coutstr.find_last_of(wab,5)endl;//从原串中下标为5开始逆向查找首先f与待查子串每一字符比较若有相同的就输出该字符在原串的下标。//若一个都没有就依次逆向比较即e再与待查子串一一比较直到原串的b与待查子串中的b相同然后输出该b在原串的下标1。coutstr.find_last_of(fab,5)endl;//输出f在原串的下标5。coutstr.find_last_of(fab,7)endl;//输出b在原串的下标7。coutstr.find_last_of(hwk)endl;//原串没有待查子串的任何字符故返回npos。return 0;
}
//有效的下标应该在0~len-1范围内。lenstr.size(); 要相信别人能做出来自己一定可以做出来只不过是时间没到而已