C++Primer3_2

本文详细介绍了C++中std::string类型的使用,包括默认初始化、复制、赋值以及从输入流读取和写入输出流。还讨论了如何通过getline函数读取一行,并展示了如何进行字符串拼接。此外,文章讲解了范围for循环在处理字符串每个字符时的应用,以及如何利用setw和setf进行格式化输出。同时,提到了auto和decltype的区别,强调了它们在类型推导上的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准库类型 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 比较纯粹,它一般会坚持保留原始表达式的任何类型,让推导的结果更加原汁原味。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值