【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不同:


相关文章
|
1天前
|
存储 算法 程序员
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
|
1天前
|
存储 缓存 编译器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
|
1天前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
|
1天前
|
编译器 C++ 容器
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
|
1天前
|
存储 算法 程序员
【C++进阶】深入STL之vector:构建高效C++程序的基石
【C++进阶】深入STL之vector:构建高效C++程序的基石
|
1天前
|
编译器 C++
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
|
1天前
|
安全 算法 C语言
【C++进阶】深入STL之string:掌握高效字符串处理的关键
【C++进阶】深入STL之string:掌握高效字符串处理的关键
【C++进阶】深入STL之string:掌握高效字符串处理的关键
|
2天前
Failed to bind properties under ‘logging.level‘ to java.util.Map java.lang.String, java.lang.String
Failed to bind properties under ‘logging.level‘ to java.util.Map java.lang.String, java.lang.String
4 0
|
3天前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
12 0
|
3天前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
10 0