string包含在标准命名空间std中。
初始化方式
string s1; // 默认初始化,s1是一个空串
string s2(s1); // s2是s1的副本
string s2 = s1; // 等价于string s2(s1)
string s3("value"); // s3中存储字符串"value",没有'\0'
string s3 = "value"; // 等价于string s3("value")
string s4(n, '\c'); // s4里面存放了连续的n个'\c'
使用=的为拷贝初始化,不使用等号执行的则是直接初始化。
string对象上的操作
os << s // 将s写入到输出流,返回os
in >> s // 在in中读取字符串赋值给s,以空白字符(空格、换行符等)作为结束,返回is
getline(is, s) // 从is里读取一行赋值给s,以换行符为结束,但换行符会被丢弃,返回is
s.empty() // s为空串时返回真
s.size() // 返回s中字符的个数
s[n] // 返回s中第n个字符的引用,n是string::size_type类型
s1 + s2 // 返回s1和s2连接后的结果
s1 = s2 // 用s2的副本替换s1
s1 == s2 // 若s1与s2所含字符完全一样则返回真
s1 != s2 // 判断对大小写敏感
<, <=, >, >= // 以字典序和长度来排序
string::size_type类型
string::size_type是一个无符号类型,如果表达式有了size()函数就不要再使用int类型,这样可以避免混用int和unsigned可能带来的问题。
int与无符号数混用时,int会转换成unsigned类类型,当int为一个负数,那么转换成unsigned类型时值一般会很大,诸如s.size() < n的代码总是会返回真。
字面值和string对象相加
string中重载了+运算符,允许string对象和字符串字面值相加,根据运算符重载,不允许出现+两侧都是字符串的情况:
string s1 = s + "hello" + "world"; // 正确
string s2 = s + ("hello" + "world"); // 错误,字面值不能直接相加
基于范围的for循环
范围for循环语句,可以遍历给定序列的每个元素,其语法形式是:
for(declaration : expression)
statement
例如:
for(auto c : str) {
cout << c << endl; // 逐字符输出str的内容,不能通过c来修改str的值,因为c不是一个引用
}
如果想用范围for循环改变序列中的元素,那么应该把循环变量定义成引用类型,例如:
for(auto &c : str) {
c = toupper(c); // c是一个引用,因此赋值语句可以改变str中字符的值
}