标准库类型 string
定义和初始化 string
string s1; // 默认初始化
string s2 = s1; // s2 是 s1 的副本
string S3 = "hiya"; // s3 是该字符串里面的值的副本
string s4(10, 'c'); // s4 的内同是 "ccccccccccc"
string s5(s4); // 等价于 s5 = s4
string对象操作
os << s; // 将 s 写到输出流 os 中,返回 os
is >> s; // 从 is 中读取数据赋给 s,字符串以空白分割,返回 is
<, <=, >, >=; // 利用字符在字典中的顺序进行比较,且对大小写敏感
string 对象会自动忽略开头的空白,并从第一个真正的字符开始读,直到遇见下一个空白
使用 getline 读取一行
getline 的输入参数是一个输入流和一个string对象,函数从给定的输入流中读取内容,直到遇到换行符为止<换行符>也会被读入。然后把读取内容存到string对象中,r不包含换行符。
字面值和string相加
string s3 = s1 + "hello"; // 正确
string s4 = "hello" + ","; // 错误,两个运算对象都不是string
string s6 = s1 + "," + "word"; // 正确,每个加法运算都有一个运算对象是 string
string s7 = "hello" + "," + s1; // 错误,不能把子面子直接相加
处理每个字符
C++11 新标准提供了一种新的语句范围 **for(range for)**语句。这种语句遍历给定序列中的元素并对序列中每个执行某种操作,其语法是
for(declaration : expression)
statement
eg
string s1 = "helwo-123598";
for (auto c : s1)
{
cout << c << " ";
cout.width(10);
cout.setf(ios::left);
if (isdigit(c))
{
cout << "number" << setw(4) << " ";
}
if (isalpha(c))
{
cout << "alpha" << setw(4) << " ";
}
cout << typeid(c).name() << setw(4) << " ";
cout << endl;
}
setw(num) 占位符,占多 num 位
cout.width(num) 输入占多少位
cout.setf(ios::left) 靠左输出r
使用下标进行迭代
for(decltype(s.size()) index = 0; index != s.size() && isspace(s[index]); ++index)
{
s[index] = toupper(s[sindex]);
}
decltype 编译器分析表达式并得到数据类型
decltype + 变量 返回变量的类型,包括 const 和引用
decltype + 表达式 decltype会返回表达式结果对应的类型
decltype与auto区别
通过使用 auto 关键字,我们就能让编译器替我们去分析表达式所属的类型,和原来那些只对应某种特定的类型说明符(例如 int )不同, auto 能让编译器通过初始值来进行类型推演,从而获得定义变量的类型
auto 定义的变量必须有初始值
对于 decltype 所用的表达式来说,如果变量名加上一对括号,则得到的类型与不加上括号的时候可能不同。
如果 decltype 使用的是一个不加括号的变量,那么得到的结果就是这个变量的类型。但是如果给这个变量加上一个或多层括号,那么编译器会把这个变量当作一个表达式看待,变量是一个可以作为左值的特殊表达式,所以这样的decltype就会返回引用类型
- auto 根据=右边的初始值 value 推导出变量的类型;
- decltype 根据 exp 表达式推导出变量的类型,跟=右边的 value 没有关系。
总结: auto 虽然在书写格式上比 decltype 简单,但是它的推导规则复杂,有时候会改变表达式的原始类型;而 decltype 比较纯粹,它一般会坚持保留原始表达式的任何类型,让推导的结果更加原汁原味。