您的位置:首页 > 编程语言 > C语言/C++

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

2016-02-22 20:13 253 查看

标准库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

字符串可以直接用下标来访问,位置从0开始计数,但是下标操作符需要是一个size_type类型的值。通过下标我们不仅可以访 问该字符串中对应位置的值,还可以对对应位置进行赋值,即s
既可以作为赋值符号=的右操作数,也可以作为其左操作数, 即a = s
与s
=’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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: