string 类库中的size_type是一种怎样的自定义类型
在 C++ 的 string 类库中,size_type 是一种无符号整数类型,用于表示字符串的大小(长度)。
它被定义为能够容纳字符串可能的最大长度的无符号整数类型。
比如说,如果一个字符串可能非常长,使用普通的 int 可能无法表示其长度,这时就会使用 size_type 来确保有足够的范围来准确表示字符串的长度。
举个例子,如果要遍历一个字符串 std::string str = "Hello World"; ,可以这样写:
for (std::string::size_type i = 0; i < str.size(); ++i) {// 对每个字符进行操作
}这样能保证在处理不同长度的字符串时,不会出现长度表示范围不足的问题。
这样设计的原因
string 类中使用 size_type 这样的自定义类型来表示字符串的大小主要有以下几个原因:
-  可移植性:不同的平台上,整数类型的大小可能会有所不同。使用自定义的 size_type可以确保在各种平台上,string的大小表示都能有一致的行为和足够的范围。
-  明确语义:使用 size_type能更清晰地表明这个类型专门用于表示字符串的大小,增加了代码的自解释性。
-  避免错误:如果直接使用 int或其他固定的整数类型,可能会在处理特别长的字符串时出现溢出等错误。而size_type通常被设计为能够适应字符串可能达到的最大长度。
-  与标准库的一致性:整个标准库在很多容器和数据结构中都采用了类似的设计,使用自定义的类型来表示特定的度量,这有助于保持代码风格的统一和可理解性。 
string对象与字符串字面值
在 C++ 中,将 string 对象与字符串字面值常量相加时,需要确保字符串字面值常量被明确转换为 string 类型。
可以使用 + 运算符来实现相加,例如:
std::string str = "Hello ";
std::string result = str + "World"; 在 C++ 中,不能直接使用 + 运算符把两个 const char 数组(也就是字符串字面值)相加。
std::string s2 = "world";
std::string s4 = "hello" + "," + s2;其中字面值字符串“hello”和“,”是不能之间相加的,需要显示的进行类型转换string("hello")
string对象与字符串字面值相加时产生的临时对象
如:
string s1 = "hello";
string s3 = s1 + "," + "world";与下面的语句是等价的:
string s1 = "hello";
string tmp = s1 + ",";
string s3 = tmp + "world";tmp就是产生的临时对象。
在执行表达式计算过程中,会创建这个临时对象来存储中间结果。通常,编译器会在需要的时候分配内存来存储这个临时对象,并且在表达式的计算完成后,如果没有其他引用指向它,它会在适当的时候被释放。
string类的输入运算符和getline()函数是如何处理空白字符的
在 C++ 的 string 类中,输入运算符 >> 和 getline() 函数在处理空白字符时有不同的行为。
输入运算符 >> 会自动忽略输入前面的空白字符(如空格、制表符、换行符等),并且在遇到空白字符时会停止读取,将之前读取的非空白字符部分作为一个字符串存入目标 string 对象中。
例如,如果输入是 hello world ,使用 std::cin >> str; ,那么 str 只会被赋值为 hello 。
而 getline() 函数则会读取包括空白字符在内的一整行输入,直到遇到换行符为止。
例如,如果输入是 hello world ,使用 std::getline(std::cin, str); ,那么 str 会被赋值为 hello world 。
范围for语句
范围 for 语句是 C++11 引入的一种更简洁的循环结构,用于遍历一个序列(如数组、vector 、string 等)中的每个元素。
其一般形式为:
for (declaration : expression)statement在处理 string 的每个字符时,范围 for 语句非常有用。它可以让您无需关心索引的操作,就能直接遍历字符串中的每个字符。
std::string str = "Hello";
for (char c : str) 
{std::cout << c << " ";
}