7.string容量
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. }
bool empty() const;//判断字符串是否为空
1. string s1; 2. cout << s1.empty() << endl;
size_t capacity() const;//返回所分配内存的字节数
1. string s1("cplusplus.com"); 2. cout << s1.size() << endl; 3. cout << s1.capacity() << endl;
capcity( )比size( )大,要给'\0'留空间:
只调整字符串大小,不填充内容
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);后:
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不同: