标准库String类型学习
String类型的初始化方式
- string s1
- string s2(s1)
- string s3(“value”)
- string s4(n, c)
- 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)
- 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)
- s.assign(s2,pos2, len)
- 用s2中从下标pos2开始的len个字符副本替换s
- s.assign(cp, len)
- s.assign(cp)
- s.erase(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()
- end
——————————————————————————————————– - 查找操作
- s.find(args)
- s.rfind(args)
- s.find_first_of(args)
- s.find_lase_of(args)
- s.find_first_not_of(args)
- s.find_last_not_of(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.compare(pos1, n1, s2)
- s.compare(pos1, n1, s2, pos2, n2)
- 让s中从Pos1开始的n1个元素与s2中从pos2开始n2个元素进行比较
- s.compare(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]
}