(未完)string 学习笔记

本博客只是用作学习笔记,不保证任何专精深的知识,只是知识点的罗列,便于查询。


1. string 是 标准库类型,因此使用前必须先 #include <string>,定义在命名空间 std 中。
2. string 表示可变长的字符序列。
3. 初始化 sting 对象的方式  (《C++ Primer 中文版 5th》page: 76)

  • string s1 默认初始化,s1 是一个空串
  • string s2(s1) s2 是 s1 的副本
  • string s2 = s1 等价于 s2(s1) ,s2 是 s1 的副本
  • string s3("value") s3 是字面值 "value" 的副本,除了字面值最后的那个空字符外 ?s3最后的那个空字符时如何加上去的?
  • string s3 = "value" 等价于 s3("value"),s3 是字面值 "value" 的副本 ?也不包含字面值最后的 那个空字符?
  • string s4(n, 'c') 把 s4 初始化为由连续 n 个字符 c 组成的串
注:使用等号(=)初始化一个变量,实际上执行的是拷贝初始化 (copy initialization),编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化 (direct initialization)。

4. string 对象上的操作

  • os << s 将 s 写到输出流 os 当中,返回 os (Note :<< 和 >> 运算符都是由 string 类自己定义)
  • is >> s 从 is 中读取字符串赋给 s,字符串以空白分割,返回 is
  • getline(is, s) 从 is 中读取一行赋给 s,返回 is。
  • s.empty() s 为空返回 true,否则返回 false
  • s.size() 返回 s 中字符的个数
  • s[n] 返回 s 中第 n 个字符的引用,位置 n 从0计起
  • s1+s2 返回 s1 和 s2 连接后的结果
  • s1=s2 用 s2 的副本代替 s1 中原来的字符
  • s1==s2 如果 s1 和 s2 中所含的字符完全一样,则它们相等;string 对象的
  • s1!=s2 等性判断对字母的大小写敏感
  • <,<=,>,>= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感

5. 在执行读取操作时,string 对象会自动忽略开头的空白(即空格符,换行符,制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。

6. 读取未知数量的 string 对象

<span style="white-space:pre">	</span>while (cin >> str)
Note:表达式 cin >> str 返回流 cin,作为 while 的 condition 子句,该条件负责在读取时检测流的情况,如果流有效,也就是说没有遇到文件结束标记或非 法输入,那么条件为 true;反之,一旦遇到文件结束标记或非法输入,条件则为 false,循环结束。

在 centos 的终端输入中,输入结束符由 Ctrl+D 产生。

7. 使用 getline 读取一整行

希望能在最终得到的字符串中保留输入时的空白符

从给定的输入流中读入内容,直到遇到换行符为止,保留此前的其他空白符(注意换行符也被读进来了),然后把所读的内容存入到 string 对象中去 (注意不存换行符。getline 只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是换行符,那么所得的结果是个空 string。

Note:触发 getline 函数返回的那个换行符实际上被丢弃掉了,得到的 string 对象中并不包含该换行符。

8. string::size_type 类型

string 的 size 函数返回的是一个 string::size_type 类型的值。

string 类及其他大多数标准库类型都定义了几种配套的类型,这些配套类型体现了标准库类型与机器无关的特性,size_type即是其中一种。

string::size_type 是一个无符号类型的值而且能足够存放下任何 string 对象的大小。所有用于存放 string 类的 size 函数返回值的变量,都应该是 string::size_type类型的。

格外注意:由于 size 函数返回的是一个无符号整型数,因此切记,如果在表达式中混用了带符号数和无符号数将可能产生意想不到的结果。例如,假设 n 是一个具有负值的 int,则表达式 s.size()<n 的判断结果几乎肯定是 true,这是因为负数 n 会自动转换成一个比较大的无符号值。

Tip:如果一条表达式中已经有了 size() 函数,就不要再使用 int 了,这样可以避免混用 int 和 unsigned 可能带来的问题。

9. string 对象的比较

string 类定义了几种用于比较字符串的运算符,它们都逐一比较 string 对象中的字符,并且对大小写敏感。

相等性运算符(== 和 !=),string 对象相等意味这它们的长度相同而且所包含的字符也全都相同。

关系运算符 (<,<=,>,>=),依照(大小写敏感的)字典顺序:

1). 如果两个 string 对象的长度不同,而且较短的 string 对象的每个字符都与较长的 string 对象对应位置上的字符相同,就说较短 string 对象小于较长 string 对象。

2). 如果两个 string 对象在某些对应的位置上不一致,则 string 对象比较的结果其实是 string 对象中第一对相异字符比较的结果。

10. 两个 string 对象相加得到一个新的 string 对象,其内容是把左侧的运算对象与右侧的运算对象串接而成。

标准库允许把字符字面值和字符串字面值转换成 string 对象,所以在需要 string 对象的地方就可以使用这两种字面值来替代。

当把 string 对象和字符字面值及字符串字面值混在一条语句中使用事,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是 string:

<span style="white-space:pre">	</span>s2 = "hello" +  '\n' + s1;   //错误:不能把字面值直接相加
11. 因为某些历史原因,也为了与 C 兼容,所以 C++ 语言中的字符串字面值并不是标准库类型 string 的对象。切记,字符串字面值与 string 对象是不同的类型。
12. 处理 string 对象中的字符

在 cctype 头文件中定义了一组标准库函数来改变或处理某个字符的特性。主要函数名及其含义如下:

  • isalnum(c) 当 c 是字母或数字时为真
  • isalpha(c) 当 c 是字母时为真
  • iscntrl(c) 当 c 是控制字符时为真
  • isdigit(c) 当 c 是数字时为真
  • isgraph(c) 当 c 不是空格但可以打印时为真
  • islower(c) 当 c 是小写字母时为真
  • isprint(c) 当 c 是可打印字符时为真(即 c 是空格或 c 具有可视形式)
  • ispunct(c) 当 c 是标点符号时为真(即 c 不是控制字符,数字,字母,可打印空白中的一种)
  • isspace(c) 当 c 是空白时为真(即 c 是空格,横向制表符,纵向制表符,回车符,换行符,进纸符中的一种)
  • isupper(c) 当 c 是大写字母时为真
  • isxdigit(c) 当 c 是十六进制数字时为真
  • tolower(c) 如果 c是大写字母,输出对应的小写字母;否则原样输出 c
  • toupper(c) 如果 c是小写字母,输出对应的大写字母;否则原样输出 c

13. 可以使用范围 for (range for) 语句遍历给定 string 对象中的每个字符

<span style="white-space:pre">	</span>for (auto c : str)     //对于 str 中的每个字符
如果想要改变 string 对象中字符的值,必须把循环变量定义成引用类型。记住,所谓引用只是给定对象的一个别名,因此当使用引用作为循环控制变量时,这个变量实际上被绑定到了序列的每个元素上,使用这个引用,就能改变它绑定的字符。
<span style="white-space:pre">	</span>for (auto &c : str)    //对于 str 中的每个字符(注意:c 是引用)
14. 使用下标运算符([ ])访问 string 对象中的某个字符

[ ]运算符接收的输入参数是 string::size_type 类型的值,这个参数表示要访问的字符的位置,返回值是该位置上字符的引用。

Note:string 对象的下标必须大于等于0而小于 s.size();使用超出此范围的下标将引发不可预知的结果,以此推断,使用下标访问空 string 也会引发不可预知的结果。其实,不管什么时候只要对 string 对象使用下标,都要确认在那个位置上确实有值。

一种简便易行的方法是,总是设下标的类型为 string::size_type,因为此类型是无符号数,可以确保下标不会小于0,此时,只要确保下标小于 size()的值即可。

C++标准并不要求标准库检测下标是否合法,一旦使用了一个超出范围的下标,就会产生不可预知的结果。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值