C++ primer阅读笔记之标准库String类型学习

标准库String类型学习

String类型的初始化方式

  • string s1
    • 默认构造函数,s1为空串
  • string s2(s1)
    • 将s2初始化为s1的一个副本
  • string s3(“value”)
    • 将s3初始化为一个字符串字面值副本
  • string s4(n, c)
    • 将s4初始化为字符‘c’的n个副本
  • string s(cp, n)
    • 创建一个string对象,它被初始化为cp所指向数组的前n个元素的副本
  • string s(s2, pos2)
    • 创建一个string对象,其被初始化为已存在的string对象s2中从下标pos2开始的字符的副本
  • string s(s2, pos2, len2)
    • 创建一个string对象,其被初始化为已存在的string对象s2中从小标pos2开始的len2个字符的副本

String对象的读写(cin, getline)

  • 我们可以使用标准输入输出操作符来直接读写字符串,即可以直接用cin >> s 和 cout << s来读写字符串(读取连续字符串,不包含空格,回车等空白字符
    • 用cin >> s 是读字符串并写入到s中,其在写的时候,首先,读取并忽略开头的所用空白字符,然后读取字符直到再次遇到空白符终止,即如果我们读取为一个“Hello World”的字符串,那我们只能读到“Hello”,因为o后面遇到了空格,无法再继续读取
  • getline(cin, s),读取一行文本并存储到s中
    • getline函数是从输入流的下一行读取,并保存读取的内容到s中,这行内容并不包括换行符。getline并不忽略行开头的换行符。只要其遇到换行符,则停止读入并返回。如果开头即为换行符,那么将会返回一个空字符串

String对象的操作

  • s.empty()
    ——————————————————————————————————–
  • s.size()
    返回s中字符的个数(这里的字符包括那些空白字符),返回的类型不是int型,而是string::size_type类型,故不要把size的返 回值赋值给一个int型的值
    ——————————————————————————————————–
  • s[n]
    字符串可以直接用下标来访问,位置从0开始计数,但是下标操作符需要是一个size_type类型的值。通过下标我们不仅可以访 问该字符串中对应位置的值,还可以对对应位置进行赋值,即s[n]既可以作为赋值符号=的右操作数,也可以作为其左操作数, 即a = s[n]与s[n] =’a’都成立
    ——————————————————————————————————–
  • s1 + s2
    ——————————————————————————————————–
  • s.append(args)
    把args串接在s后面,返回s的引用
  • s.replace(pos, len, args)
    删除s中从下标pos开始的len个字符,用args指定的字符进行替换,返回s的引用
  • s.replace(b, e, args)
    删除s中迭代器b到e所标记范围内的所有元素,然后用args替换,返回s的引用
    ——————————————————————————————————–
  • 这里的args参数可以是如下:
    • s2, string类型的字符串
    • s2, pos2, len2 字符串s2中从下标pos2开始的len2个字符
    • cp 指针cp指向的以空字符结束的数组
    • cp, len2 cp指向的以空字符结束的数组中前len2个字符
    • n, c 字符c的n个副本
    • b2, e2 迭代器b2和e2标记的范围内所有字符
  • end
    ——————————————————————————————————–
  • s1 = s2
    把s1的内容替换为s2的内容,这里我们可以直接进行替换
    ——————————————————————————————————–
  • s1 == s2
    比较s1与s2的内容,相等返回true,否则返回false,这里比较的是内容,而非存储位置
    ——————————————————————————————————–
  • !=, <, <=, >, >=
    ———————————————————————————————————
  • 与容器共有的修改string对象的方法(详细查看vector部分)
    • s.insert(p, t)
    • s.insert(p, n, t)
    • s.insert(p, b, e)
    • s.assign(b, e)
    • s.assign(n ,t)
    • s.erase(p)
    • s.erase(b, e)
  • string特有的修改方法
    • s.insert(pos, n, c)
      • 在下标pos的元素之前插入n个字符c
    • s.insert(pos, s2)
      • 在下标pos的元素之前插入string对象s2的副本
    • s.insert(pos, s2, pos2, len)
      • 在下标pos的元素之前插入s2中从下标pos2开始的len个字符
    • s.insert(pos, cp, len)
      • 在下标pos的元素之前插入cp所致数组的前len个字符
    • s.insert(pos, cp)
      • 在下标pos的元素之前插入cp所指向的以空字符结束的字符串副本
    • s.assign(s2)
      • 用s2的副本替换s
    • s.assign(s2,pos2, len)
      • 用s2中从下标pos2开始的len个字符副本替换s
    • s.assign(cp, len)
      • 用cp所指向数组的前len个字符副本替换s
    • s.assign(cp)
      • 用cp所指向的以空字符结束的字符串副本替换s
    • s.erase(pos, len)
      • 删除从下标pos开始的len个字符
  • end
    ——————————————————————————————————–
  • 子串操作
    • s.substr(pos, n)
      • 返回一个string类型的字符串,其包含s中从下标pos开始的n个字符
    • s.substr(pos)
      • 返回一个string类型的字符串,其包含s中从下标pos开始到s末尾所有字符,即从[pos, s.length())的所有元素,其中s.length()指最后一个元素的下一个位置,因此如果pos == s.length(),返回的将是一个空字符串,长度为0,并不会报错,但是如果pos > s.length(), 则会报错访问了未知区域
    • s.substr()
      • 返回s的副本
  • end
    ——————————————————————————————————–
  • 查找操作
    • s.find(args)
      • 在s中查找args的第一次出现
    • s.rfind(args)
      • 在s中查找args的最后一次出现
    • s.find_first_of(args)
      • 在s中查找args的任意字符的第一次出现
    • s.find_lase_of(args)
      • 在s中查找args的任意字符的最后一次出现
    • s.find_first_not_of(args)
      • 在s中查找args的第一个不属于args的字符
    • s.find_last_not_of(args)
      • 在s中查找args的最后一个不属于args的字符
  • end
    ——————————————————————————————————–
  • 这里的args参数可以是如下:
    • s2, pos 在s中,从下标pos的位置开始,查找string对象s2。pos值默认为0
    • c, pos 在s中,从下标pos标记的位置开始,查找字符c
    • cp, pos 在s中,从下标pos标记的位置开始,查找指针cp所指向的以空字符串结束的字符串
    • cp, pos, n 在s中,从下标pos标记的位置开始,查找指针cp所指向数组的前n个字符
  • end
    ——————————————————————————————————–
  • string的比较
    • s.compare(s2)
      • 比较s和s2
    • s.compare(pos1, n1, s2)
      • 让s中从Pos1开始的n1个元素与s2进行比较
    • s.compare(pos1, n1, s2, pos2, n2)
      • 让s中从Pos1开始的n1个元素与s2中从pos2开始n2个元素进行比较
    • s.compare(cp)
      • 比较s和cp所指向的以空字符结束的字符串
    • s.compare(pos1, n1, cp)
      • 比较s中从pos1开始的n1个元素和cp所指向的以空字符结束的字符串
    • s.compare(pos1, n1, cp, n2)
      • 比较s中从pos1开始的n1个元素和cp所指向的以空字符结束的字符串的前n2个字符作比较
  • 对于s1.compare(args),正数,s1 > args, 负数, s1 < args,0,s1 == args

string::size_type类型

  • size()成员函数按理说应该返回的是int型数值,但是实际上返回的确是string::size_type类型
  • string::size_type类型为一种String类型的配套类型,与机器无关,该类型与unsigned类型具有相同的含义,故其能存储的string的长度是int型的2倍
  • 我们可以近似的把string::size_type视为一个无符号整型

string类型的赋值操作

  • string类型的赋值操作的效率是比较低的,因为其首先要把s1所占用的内存释放掉,然后再给s1分配足够放s2的内存空间,然后再把s2的所有字符复制到该内存空间中

两个字符串相加

  • 我们要注意,因为字符串string类型与字面字符串“abc”是两种不同的类型,所以我们可以进行s1+s2这样的操作,但是不能做”abc”+”bcd”这样的操作(这是因为字面字符串为 const char*类型,是指针,是无法完成字符串连接操作的),故+操作符中的左右操作数至少有一个需要时string类型的

string对象字符的处理(均在cctype头文件中定义)

  • isalnum(c) 如果c是字母或数字,则为true
  • isalpha(c) 如果c是字母,则为true
  • iscntrl(c) 如果c是控制字符,则为true
  • isdigit(c) 如果c是数字,则为true
  • isgraph(c) 如果c不是空格,但可打印,则为true
  • islower(c) 如果c是小写字母,则为true
  • isprint(c) 如果c是可打印字符,则为true
  • ispunct(c) 如果c是标点符号,则为true
  • isspace(c) 如果c是空白字符,则为true
  • isupper(c) 如果c是大写字母,则为true
  • isxdigit(c) 如果c是十六进制数,则为true
  • tolower(c) 如果c是大写字母,则返回其小写形式,否则直接返回c
  • toupper(c) 如果c是小写字母,则返回其大写形式,否则直接返回c

note:

  • “abc”这样的字符串我们成为字符串字面值,在C++中字符串字面值与标准库字符串不是同一种类型,字符串字面值为const char*类型,其结尾为\0,而string类型结尾则没有\0。
  • s+”abc”后返回的依然是一个字符串string类型
  • 在字符串中,任何的整型数值均可以作为索引,但索引的实际数据类型确实unsigned类型string::size_type
  • 对于c++,我们可以通过库中的stream来将数组转化为string类型的数组,假设我们有长度为n的整数数组num,我们可以利用一下代码转化为对应的字符串数组
string *strNum = new string[n];
for(int i = 0; i < n; ++i){
    stringstream stream;
    stream << num[i];
    stream >> strNum[i]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值