【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++ 容器
|
1月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
68 5
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
52 1
|
1月前
|
C++ 容器
|
1月前
|
C++ 容器
|
1月前
|
存储 C++ 容器
|
1月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
1月前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
47 0