Wordpress网站防止采集,网站的功能包括哪些,织梦网站安装出现404 not found,公司执照注册流程及费用前言 C语言中#xff0c;字符串是以\0结尾的一些字符的集合#xff0c;为了操作方便#xff0c;C标准库中提供了一些str系列的库函数#xff0c;但是这些库函数与字符串是分离开的#xff0c;不太符合OOP的思想#xff0c;而且底层空间需要用户自己管理#xff0c;稍不留…前言 C语言中字符串是以\0结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数但是这些库函数与字符串是分离开的不太符合OOP的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。 在OJ中有关字符串的题目基本以string类的形式出现而且在常规工作中为了简单、方便、 快捷基本都使用string类很少有人去使用C库中的字符串操作函数。 1.标准库中的string类
C中的string类是STL中的一个重要的组成部分string类是一个用于操作字符串的强大工具。
在使用string类时必须包含#include头文件以及using namespace std;
下面是参考的官方链接
https://cplusplus.com/reference/string/string/?kwstring 2. string类对象的常见构造 #include iostream
using namespace std;
#include string
int main()
{string s1;// 构造空的string类对象s1string s2(hello world);// 用C格式字符串构造string类对象s2string s3(s2);// 拷贝构造s3cout s1 endl;cout s2 endl;cout s3 endl;string s7(10, x);//string类对象中包含n个字符ccout s7 endl;
} 3.string类对象的容量操作 void test_string5()
{string s2(hello world);cout s2.length() endl;//求长度不包括/0cout s2.size() endl;//求长度一般用size不包括/0cout s2.capacity() endl;//求容量//清理有效字符s2.clear();string s(I love you);cout s.length() endl;//求长度cout s.size() endl;//求长度一般用size不包括/0//使用empty判空if (s.empty())cout empty endl;elsecout not empty endl;s.resize(17, f); //将有效字符的个数改成n个多出的空间用字符c填充cout s endl;cout s.length() endl;cout s.size() endl;cout s.capacity() endl;//清理有效字符s.clear();//多打印几行看看cout s endl;cout s endl;cout s endl;
} 上面我们可以看到capacity会随着字符串增加而变化那么扩容是怎么扩容的呢如下
扩容在VS和g中略显不同的大家可以去尝试一下。
VS下
void TestPushBack()
{string s;//提前开空间避免扩容提高效率//s.reserve(100);size_t sz s.capacity();cout capacity changen: sz \n;cout making s grow:\n;for (int i 0; i 100; i){s.push_back(c);if (sz ! s.capacity()){sz s.capacity();cout 扩容: sz \n;}}
} 当把/0加上时发现第一次扩容是2倍扩后面扩容是1.5倍扩这是VS自己规定的变化规则为什么第一次是2倍扩呢当字符串小于16字节时会存放在一个固定的buff数组中超过16会2倍扩容后面开辟空间是在堆上。
g 可以看到g扩容就是2倍扩
注意
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不会改变容量大小。
void test_string4()
{string s2(hello worldxxxxxxxxxxxxx);cout s2.size() endl;cout s2.capacity() endl endl;s2.reserve(20);cout s2.size() endl;cout s2.capacity() endl endl;s2.reserve(28);cout s2.size() endl;cout s2.capacity() endl endl;s2.reserve(40);cout s2.size() endl;cout s2.capacity() endl endl;s2.reserve(80);cout s2.size() endl;cout s2.capacity() endl endl;s2.reserve(10);cout s2.size() endl;cout s2.capacity() endl endl;//s2.clear();//cout s2.size() endl;//cout s2.capacity() endl endl;}
4.auto和范围for
auto关键字
在这里补充2个C11的小语法方便我们后面的学习。
在早期C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量后来这个不重要了。C11中标准委员会变废为宝赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。
用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须加
当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际 只对第一个类型进行推导然后用推导出来的类型定义其他变量。
auto不能作为函数的参数可以做返回值但是建议谨慎使用
auto不能直接用来声明数组
int func1()
{return 10;
}// 不能做参数
//void func0(auto a 0)
//{}auto func2()
{//...return func1();
}auto func3()
{//...return func2();
}
int main()
{int a 10;auto b a;auto c a;auto d func1();// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项//auto e;cout typeid(b).name() endl;cout typeid(c).name() endl;cout typeid(d).name() endl;int x 10;auto y x;auto* z x;auto m x;cout typeid(x).name() endl;cout typeid(y).name() endl;cout typeid(z).name() endl;cout typeid(m).name() endl;auto ret func3();//这里使用auto复杂auto aa 1, bb 2;// 编译报错error C3538: 在声明符列表中“auto”必须始终推导为同一类型//auto cc 3, dd 4.0;// 编译报错error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型auto array[] { 1, 2, 3, 4, 5 };return 0;
} #includeiostream
#include string
#include map
using namespace std;
int main()
{std::mapstd::string, std::string dict { { apple, 苹果 },{ orange,橙子 }, {pear,梨} };// auto的用武之地//std::mapstd::string, std::string::iterator it dict.begin();auto it dict.begin();while (it ! dict.end()){cout it-first : it-second endl;it;}return 0;
}范围for
对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因此 C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围自动迭代自动取数据自动判断结束。
范围for可以作用到数组和容器对象上进行遍历
范围for的底层很简单容器遍历实际就是替换为迭代器这个从汇编层也可以看到。
#includeiostream
#include string
using namespace std;
int main()
{int array[] { 1, 2, 3, 4, 5 };// C98的遍历for (int i 0; i sizeof(array) / sizeof(array[0]); i){array[i] * 2;}for (int i 0; i sizeof(array) / sizeof(array[0]); i){cout array[i] ;}cout endl;// C11的遍历for (auto e : array)e * 2;for (auto e : array)cout e ;cout endl;string str(hello world);for (auto ch : str){cout ch ;}cout endl;return 0;
}5. string类对象的访问及遍历操作 void test_string8()
{string s2(hello world);cout s2[6] endl;s2[0] x;//修改下标为0的元素cout s2 endl;} 使用[]让我们访问元素和修改元素变得非常方便
begin、end、rbegin、rend的使用方法如下
#includeiostream
#include string
using namespace std;
int main()
{string str1,str2;str1 hello world;//定义一个正向迭代器string::iterator ptr1 str1.begin();//正向输入字符串while (ptr1 !str1.end()){cout *ptr1 ;}cout endl;str2 I love you;//定义一个反向迭代器string::reverse_iterator ptr2 str2.rbegin();//逆向输出字符串while (ptr2 ! str2.rend()){//逆向迭代器移动是反方向所以从尾部来移动cout *ptr2 ;}cout endl;
} 迭代器有四种
//定义一个正向迭代器
string::iterator ptr1 str1.begin();
//常对象正向迭代器
string::const_iterator ptr1 str1.begin();
//定义一个反向迭代器
string::reverse_iterator ptr2 str2.rbegin();
//常对象反向迭代器
string::const_reverse_iterator ptr2 str2.rbegin();
C11支持我们使用auto来定义迭代器让编译器推到迭代器的类型
#includeiostream
#include string
using namespace std;
void tets_string()
{string s1(hello world);//带参// 正向迭代器//string::iterator it s1.begin();auto it s1.begin();//auto自动推导while (it ! s1.end()){cout *it ;it;}cout endl;cout s1 endl;string s2(I love you);//带参// 反问迭代器//string::reverse_iterator rit s2.rbegin();auto rit s2.rbegin();//auto自动推导while (rit ! s2.rend()){cout *rit ;rit;//移动到下一个字符}cout endl;cout s2 endl;}
int main()
{tets_string();return 0;
}范围for
void test_string1()
{string s2(hello world);//带参//字符赋值自动迭代自动判断结束//底层就是迭代器// 范围for//for (auto ch : s2)for(auto ch : s2){cout ch ;}cout endl;cout s2 endl;
}
结束语 本节内容到此结束下节我们继续扩展string的其他接口敬请期待 感谢大家的支持如有不对的地方还请各位看客不吝指正
文章转载自: http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.hypng.cn.gov.cn.hypng.cn http://www.morning.ssjry.cn.gov.cn.ssjry.cn http://www.morning.mnqz.cn.gov.cn.mnqz.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.sqqpb.cn.gov.cn.sqqpb.cn http://www.morning.bpmdg.cn.gov.cn.bpmdg.cn http://www.morning.paoers.com.gov.cn.paoers.com http://www.morning.gbrdx.cn.gov.cn.gbrdx.cn http://www.morning.snlxb.cn.gov.cn.snlxb.cn http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.nlkm.cn.gov.cn.nlkm.cn http://www.morning.zlff.cn.gov.cn.zlff.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn http://www.morning.fppzc.cn.gov.cn.fppzc.cn http://www.morning.dskmq.cn.gov.cn.dskmq.cn http://www.morning.tjkth.cn.gov.cn.tjkth.cn http://www.morning.npfrj.cn.gov.cn.npfrj.cn http://www.morning.xzkgp.cn.gov.cn.xzkgp.cn http://www.morning.blqmn.cn.gov.cn.blqmn.cn http://www.morning.darwallet.cn.gov.cn.darwallet.cn http://www.morning.fesiy.com.gov.cn.fesiy.com http://www.morning.xinxianzhi005.com.gov.cn.xinxianzhi005.com http://www.morning.kqpq.cn.gov.cn.kqpq.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.zfcfx.cn.gov.cn.zfcfx.cn http://www.morning.xckdn.cn.gov.cn.xckdn.cn http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn http://www.morning.wgxtz.cn.gov.cn.wgxtz.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.tpqzs.cn.gov.cn.tpqzs.cn http://www.morning.lsnnq.cn.gov.cn.lsnnq.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.mszls.cn.gov.cn.mszls.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.whpsl.cn.gov.cn.whpsl.cn http://www.morning.wknjy.cn.gov.cn.wknjy.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.lsfzq.cn.gov.cn.lsfzq.cn http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.rzczl.cn.gov.cn.rzczl.cn http://www.morning.kryn.cn.gov.cn.kryn.cn http://www.morning.nbybb.cn.gov.cn.nbybb.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.nkmw.cn.gov.cn.nkmw.cn http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn http://www.morning.gqbtw.cn.gov.cn.gqbtw.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.klyyd.cn.gov.cn.klyyd.cn http://www.morning.qwmsq.cn.gov.cn.qwmsq.cn http://www.morning.wxckm.cn.gov.cn.wxckm.cn http://www.morning.xnpj.cn.gov.cn.xnpj.cn http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn http://www.morning.zyrp.cn.gov.cn.zyrp.cn http://www.morning.xyhql.cn.gov.cn.xyhql.cn http://www.morning.pffx.cn.gov.cn.pffx.cn http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn http://www.morning.qxwrd.cn.gov.cn.qxwrd.cn http://www.morning.rlqml.cn.gov.cn.rlqml.cn http://www.morning.cwjsz.cn.gov.cn.cwjsz.cn http://www.morning.xzsqb.cn.gov.cn.xzsqb.cn http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn http://www.morning.wmdqc.com.gov.cn.wmdqc.com http://www.morning.pqndg.cn.gov.cn.pqndg.cn http://www.morning.xblrq.cn.gov.cn.xblrq.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.jjpk.cn.gov.cn.jjpk.cn http://www.morning.fbylq.cn.gov.cn.fbylq.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.zxfdq.cn.gov.cn.zxfdq.cn http://www.morning.gbgdm.cn.gov.cn.gbgdm.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.kpwcx.cn.gov.cn.kpwcx.cn http://www.morning.aiai201.cn.gov.cn.aiai201.cn http://www.morning.cnyqj.cn.gov.cn.cnyqj.cn http://www.morning.bzlfw.cn.gov.cn.bzlfw.cn