string类(上)
- 1.标准库中的string类
- 2.string类对象的常见构造
- ①string()
- ②string(const char* s)
- ③string(size_t n,char c)
- ④string(const string&s)
- ⑤string(const string& str,size_t pos,size_t len=npos)
- ⑥string(const char* s,size_t n)
- 3.string类对象的容量操作
- ①size
- ②length
- ③capacity
- ④empty
- ⑤clear
- ⑥reserve
- ⑦resize
🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:标准库中的string;string类对象的常见构造;string类对象的容量操作
⬆⬆⬆⬆上一篇:C++模板初阶
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
1.标准库中的string类
string是表示字符串的字符串类
string在底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,allocator>string
在使用string类时,必须包含#include头文件以及using namespace std;
2.string类对象的常见构造
①string()
构造空的string类对象,即空字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s;
cout << s << endl;
return 0;
}
②string(const char* s)
用c-string来构造string类对象
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
cout << s << endl;
return 0;
}
③string(size_t n,char c)
string类对象中包含n个字符c
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s(10,'c');
cout << s << endl;
return 0;
}
④string(const string&s)
拷贝构造函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s(10,'c');
string s1(s);
string s2 = s;
cout << s << endl;
cout << s1 << endl;
cout << s2<< endl;
return 0;
}
⑤string(const string& str,size_t pos,size_t len=npos)
复制从字符位置pos开始并跨越len字符的str部分(如果str太短或len为string::npos,则复制到str结尾)
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
string s1(s,6,5);
cout << s1<< endl;
return 0;
}
上图是文档中查到的npos,他是一个无符号的unsigned int,值又是-1,所以说它就是无符号整形的最大值,因此,当你参数len作为缺省值或者大于str的长度时,他就是复制到str结尾
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
string s1(s,6);
cout <<s1 << endl;
return 0;
}
⑥string(const char* s,size_t n)
从由s指向的字符数组中复制前n个字符
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world",5);
cout << s << endl;
return 0;
}
3.string类对象的容量操作
①size
返回字符串有效字符长度
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
cout << s.size()<<endl;
return 0;
}
②length
返回字符串有效字符长度
和size功能一样,由于历史原因,所以说会有length,但是推荐使用size
③capacity
返回空间总大小
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
cout << s.capacity()<<endl;
return 0;
}
④empty
检测字符串是否为空串,是返回true,否则返回false
⑤clear
清空有效字符
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.clear();
cout << s.size() << endl;
cout << s.capacity() << endl;
return 0;
}
可以看出clear只是清空有效字符,但不会缩容
⑥reserve
为字符串预留空间
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.reserve(100);
cout << s.size() << endl;
cout << s.capacity() << endl;
return 0;
}
可以把空间提前开大,但是打印出来的capacity大小并不是所设置的,这是因为还存在编译器对齐等各种原因,但是无论怎么样,开出的空间肯定大于等于你所设置的参数
⑦resize
将有效字符的个数改成n个,多出的空间用字符c填充
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.resize(20,'c');
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
return 0;
}
注意:
1.size()和length()方法底层实现完全原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是使用size()
2.clear()只是将string中有效字符清空,不改变底层空间大小
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize是用0来填充多出的元素空间,resize(size_t n,char c)是用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。知道需要多少空间,提前开空间,减少扩容,提高效率
当resize没给第二个参数时:
当resize的参数小于字符串有效长度时:
可以看出resize的参数小于字符串有效字符时,会进行清除字符
🌸🌸string类(上)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪