一、string类对象是什么?
string在底层实际是basic_string模板类的别名
typedef basic_string<char, char_traits, allocator> string
template<class T>
class basic_string
{
private:
T* _str;//可以是char、wchar_t等
}
string类是basic_string模板类的一个实例,虽然大多数时候我们使用的string类型都是用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数,但是考虑到编码的问题,除了char还有wchar_t(两字节)、char16_t、char32_t等,所以string也只是basic_string模板类的一个实例
二、string的构造函数:
// string constructor
#include <iostream>
#include <string>
int main ()
{
std::string s0 ("Initial string");
// constructors used in the same order as described above:
std::string s1;//调用默认构造函数
std::string s2 (s0);//调用拷贝构造函数
std::string s3 (s0, 8, 3);//截取,从给定的字符串对象的第8个位置往后截取三个长度
//如果不写后面的3就默认截取到字符串结束 npos是string里的一个静态变量,代表整形的最大值
std::string s4 ("A character sequence");//from c-string 拷贝一个常量字符串
std::string s5 ("Another character sequence", 12);//从给定c-string的开始位置截取12个长度
std::string s6a (10, 'x');//fill 用10个x fill对象
std::string s6b (10, 42); // 42 is the ASCII code for '*' 也是fill
std::string s7 (s0.begin(), s0.begin()+7);//用某个对象的迭代器区间初始化,从初识位置往后7个长度
std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
return 0;
}
三、string类对象的容量操作
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "The size of str is " << str.size() << " bytes.\n";
//size函数,求字符串长度 这里是11 包含空格但是没有'\0',计算的是有效字符的长度
std::cout << "The size of str is " << str.length() << " bytes.\n"
//length函数,与size函数功能一样,推荐使用size()函数,因为别的STL容器也是用的size()函数
std::cout << "max_size: " << str.max_size() << "\n";
//输出字符串的最长长度,没什么意义,一般max_size:是4294967291
std::cout << "capacity: " << str.capacity() << "\n";
//输出字符串可以存储的有效字符的容量,比如一个字符串的容量是16(包含最后的'\0'),但是可能只有5个有效字符,size()就是5,但是capacity是15(去掉了最后的'\0'),capacity>=size
str.clear();
//直接清空str字符串 str变成空串,但是它的capacity还是存在的&