【C++】-- STL之String详解(二)

简介: 【C++】-- STL之String详解

7.string容量

(1)求字符串个数

1. size_t size() const;//size()求字符串中有效字符的个数
2. size_t length() const;//length()求字符串中有效字符的个数

size( )和length( )没有区别

1. #include<iostream>
2. #include<string>
3. using namespace std;
4. 
5. int main()
6. {
7.     string s1;
8.  cout << s1.size() << endl;
9.  cout << s1.length() << endl;
10.     
11.     return 0;
12. }

(2)判空

bool empty() const;//判断字符串是否为空
1.     string s1;
2.  cout << s1.empty() << endl;

(3)容量

size_t capacity() const;//返回所分配内存的字节数
1.     string s1("cplusplus.com");
2.     cout << s1.size() << endl;
3.  cout << s1.capacity() << endl;

capcity( )比size( )大,要给'\0'留空间:

(4)调整字符串大小

只调整字符串大小,不填充内容

void resize (size_t n);//将字符串大小调整为n个字符的长度,默认插入字符'\0',32位机器一般为4的倍数,64位机器一般为8的倍数,一般按2倍去调整
1.     string s1("cplusplus.com");
2.  s1.resize(20);
3.  cout << s1.size() << endl;
4.  cout << s1.capacity() << endl;

F10-调试-窗口-监视,在resize之前,size为13个字节,13个字节全部都是有效字符:

resize之后,size为20个字节, 且新增的空间全部赋值为'\0' :

②调整字符串大小,并将增加的空间内容初始化成给定字符

void resize (size_t n, char c);//将字符串大小调整为n个字符的长度,初始化新增空间的内容为c
1.     string s1("cplusplus.com");
2.  s1.resize(20, 'c');
3.  cout << s1 << endl;
4. 
5.  s1.resize(6);
6.  cout << s1 << endl;

监视:执行完s1.resize(20, 'c');后:

 

执行完s1.resize(6);后:

(5)调整字符串容量

void reserve (size_t n = 0);//调整容量,缺省容量为0
1.     string s1("cplusplus.com");
2. 
3.  s1.reserve(20);
4.  cout << "size:" << s1.size() << endl;
5.  cout << "capacity" << s1.capacity() << endl;
6. 
7.  s1.reserve(50);
8.  cout << "size:" << s1.size() << endl;
9.  cout << "capacity" << s1.capacity() << endl;

第二次reserve 之后的容量变成了63,是第一次reserve之后容量的2倍:

用一个循环查看如何增容:

1. #include<iostream>
2. #include<string>
3. using namespace std;
4. 
5. int main()
6. {
7.  string s1;
8.  int oldCapacity = s1.capacity();
9.  for (char ch = 0; ch < 127; ch++)
10.   {
11.     s1 += ch;
12.     if (oldCapacity != s1.capacity())
13.     {
14.       cout << "增容:" << oldCapacity << "->" << s1.capacity() << endl;
15.       oldCapacity = s1.capacity();
16.     }
17.   }
18.   cout << s1 << endl;
19. 
20.   return 0;
21. }

如果一开始使用reserve就把容量调整为127,发现reserve没有增容:

1. #include<iostream>
2. #include<string>
3. using namespace std;
4. 
5. int main()
6. {
7.  string s1;
8.  s1.reserve(127);
9.  int oldCapacity = s1.capacity();
10. 
11.   for (char ch = 0; ch < 127; ch++)
12.   {
13.     s1 += ch;
14.     if (oldCapacity != s1.capacity())
15.     {
16.       cout << "增容:" << oldCapacity << "->" << s1.capacity() << endl;
17.       oldCapacity = s1.capacity();
18.     }
19.   }
20.   cout << s1 << endl;
21. 
22.   return 0;
23. }

监视:

如果一开始使用resize将容量调整为127,发现增容了:

1. #include<iostream>
2. #include<string>
3. using namespace std;
4. 
5. int main()
6. {
7.  string s1;
8.  s1.resize(127);
9.  int oldCapacity = s1.capacity();
10. 
11.   for (char ch = 0; ch < 127; ch++)
12.   {
13.     s1 += ch;
14.     if (oldCapacity != s1.capacity())
15.     {
16.       cout << "增容:" << oldCapacity << "->" << s1.capacity() << endl;
17.       oldCapacity = s1.capacity();
18.     }
19.   }
20.   cout << s1 << endl;
21. 
22.   return 0;
23. }

监视:

为什么reserve( )没有增容,而resize( )增容了?

这是因为+=操作符实在字符串末尾插入,执行完s1.reserve(127);之后,size是0:

 

数据个数为0,+=直接往字符串中挨个插入。

而执行完s1.resize(127);之后,size是127:

resize( )给前127个位置插入了'\0',数据个数已经是127了,+=从第128位置向后插入,而第128位置需要增容,所以resize( )第一次增容的位置是从128开始的(因为127位置存放的是'\0'),先增了64个字节,再增了95个字节。

对于不同平台的增容,每次所增容量不一定相同,因为它们的底层如何实现增容,不同的平台实现不同,linux的增容就和VS不同:


相关文章
|
27天前
|
安全 编译器 C语言
【C++数据结构】string的模拟实现
【C++数据结构】string的模拟实现
|
13天前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
12 1
|
13天前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
10 1
|
19天前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
30 2
|
6天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
1月前
|
安全 程序员 C++
C++ --> string类的使用(详细介绍)
C++ --> string类的使用(详细介绍)
32 5
|
1月前
|
存储 编译器 C语言
C++ --> string类模拟实现(附源码)
C++ --> string类模拟实现(附源码)
56 4
|
15天前
|
存储 C++
C++ dll 传 string 类 问题
C++ dll 传 string 类 问题
15 0
|
20天前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
29 0
|
26天前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针