网站官网建设,网站页面自动还原代码,wordpress占用id,比价网站源码贴主在学习string类时遇到过两个困扰我的问题#xff0c;今天拿出来给大家分享一下我是如何解决的
一、扩容时capacity的增长问题
在string的capacity()接口中#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)#xff0c;而size()是调用的string对象现在有…贴主在学习string类时遇到过两个困扰我的问题今天拿出来给大家分享一下我是如何解决的
一、扩容时capacity的增长问题
在string的capacity()接口中调用的是这个string对象的容量(可以存多少个有效字符)而size()是调用的string对象现在有效字符的个数。
string s1;
cout s1.size() endl s1.capacity() endl; 直接定义一个空的string对象然后分别输出它的size和capacity结果会是0和15
这是因为capacity默认一开始是15(只要size没有超过15)
如果超过了15capacity会增容到31从这里开始就有规律了 每次都是差不多1.5倍的关系
然而如果在实例化string对象时直接初始化一个大于15的字符串
string s1(Hello World! 123);
cout s1.size() endl s1.capacity() endl;
它这里会输出16和16为什么这次超过了15但不会扩容到31
这涉及到string的构造函数它在构造时如果所传的字符串没有超过15那capacity就是15如果超过了15capacity就会和size的值一样所以下面这段代码的capacity就可以正常扩容了
string s1(Hello);
s1 World! 123;//再尾插这个字符串
cout s1.size() endl s1.capacity() endl;
这次输出的就是16和30了
二、string的存储问题
string和C语言的char*类型最大的区别就是string不是以\0结束而是会输出全部的有效字符
这串代码会输出什么
string s Hello \0World;
cout s endl;
snihao;
cout s endl;
答案是会输出Hello 和Hello nihao
很奇怪吧不是说string对象不是以\0结尾的吗\0后面的World怎么不见了而且如果是以\0结尾nihao也不应该出现啊
这是因为string的构造函数和赋值运算符重载函数是以\0作为结束标志也就是说在拷贝完Hello后就已经结束拷贝了nihao是后加上去的自然会输出
那要怎么样才能发挥string可以输出\0后面的字符的特性呢
string s Hello ;
s \0;
sWorld;
cout s endl;
snihao;
cout s endl;
这时输出的就是Hello World和Hello Worldnihao了
也就是说既然字符串是读取到\0那直接以单个字符的形式插入\0就可以了
如果在string类里也想只输出到\0为止就可以用string的接口函数c_str()它会将string对象转换成C语言字符串的形式也就是\0结尾的形式
string s Hello ;
s \0;
sWorld;
snihao;
cout s.c_str() endl;
这次输出的就是Hello 了