常见的坑
string.size()
和string.length()
等价。string.size()
和其他STL
容器的命名风格相一致(如vector
,map
)。string.length()
出现主要是因为这样的命名符合人的直觉,有更好的可读性。string::size_type
是无符号类型,和int
不同,能存放下任何string
对象的大小。+
两边至少有一端需要是string
对象,不允许两个字符串字面量单独相加。using std::string; string a = "a"; string b = a + "b" + "c"; // 正确,从左到右运算时能保证至少一段是string对象 string c = "b" + "c" + a; // 错误,从左到右运算时第一个+左右都是字符串字面量
必须要理解的点
string
的初始化方式有两种,一种是默认初始化,另一种是拷贝初始化。string.size()
返回值类型为string::size_type
,出现这种类型是为了体现标准库类型和机器无关的特性。string
对象的比较运算完全实现了运算符重载(==
,!=
,<
,<=
,>
,>=
)。==
表明两个对象的内容和长度完全一致,反之任一不同则!=
。不等关系运算符比较的法则:
- 如果两个对象长度不同,但是从前到后内容一致,则长度较短的对象较小。
- 如果两个对象从前到后有对应位置的字符不同,则这个位置的两个字符的大小关系就是两个对象的大小关系。
string
对象赋值操作就是内容的替换。string
对象相加操作就是内容的拼接,+=
操作同理。string
对象可以与字符串字面量相加。形如
cname
的C++
头文件兼容形如ctype.h
的C
头文件,C++
头文件中定义的名字可以在std
中找到。
建议
表达式中出现
string.size()
函数时就不应该使用int
类型,这样可以避免int
和unsigned
混用的问题。C++
和C
兼容的头文件作选择时,选择C++
的头文件。处理
string
对象中每一个字符时,使用foreach
语句。#include <iostream> #include <cctype> using std::string; string str{"Some String"}; for (auto c : str) { std::cout << c << std::endl; } // 使用引用来改变原字符串内容 for (auto &c : str) { c = std::toupper(c); } std::cout << str << std::endl;
处理
string
对象中特定字符时使用[]
(下标运算符)或者迭代器。使用
[]
访问字符之前检查string
对象是否为空。std::string s = "a"; if (!s.empty()) { std::cout << s[0] << std::endl; }
string
对象下标使用string::size_type
作为类型而非int
。using std::string; string a = "Hello, world!"; string::size_type index_of_space = a.find(" ");