在刷题的时候,经常会用到string,但是用法有的时候记不住,老去翻书百度太麻烦了,就想办法总结到一起,方便以后查阅。
标准库类型string
标准库类型 string 表示可变长的字符序列,使用 string 类型必须首先包含 string 头文件。作为标准库的一部分,string 定义在命名空间 std 中。
1. 定义和初始化 string 对象
指令 | 解释 |
---|---|
string s1 | 默认初始化,s1是一个空串 |
string s2(s1) | s2 是 s1 的副本 |
string s2=s1 | 等价于 s2(s1),s2 是 s1 的副本 |
string s3(“value”) | s3 是字面值"value"的副本,除了字面值最后的那个空字符除外 |
string s3=“value” | 等价于 s3(“value”),s3 是字面值"value"的副本 |
string s4(n, ‘c’) | 把 s4 初始化为由连续 n 个字符 c 组成的 |
string s5(cp, n) | s 是 cp 指向的数组中前 n 个字符的拷贝。此数组至少应包含 n 个字符 |
string s5(s1, pos1) | s 是string s2从下标 pos1 开始的字符的拷贝。若pos1>s1.size(),构造函数的行为未定义 |
string s5(s1, pos1, len1) | s 是string s1从下标 pos1 开始进行 len1 个字符的拷贝。若pos1>s1.size(),构造函数的行为未定义。不管len1的值是多少,构造函数至多拷贝s1.size()-pos1个字符。 |
s.substr(pos, n) | 返回一个string,包含 s 中从pos开始的 n 个字符的拷贝。pos 的默认值为0,。n 的默认值为s.szie()-pos,即拷贝从pos开始的所有字符. |
2. string 对象上的操作
指令 | 解释 |
---|---|
os<< s | 将 s 写到输出流os当中,返回os (cout<< s) |
is>> s | 从 is 中读取字符串赋值给 s,字符串以空白分隔,返回 is (cin>> s) |
getline(is, s) | 从 is 中读取一行赋给 s,返回 is getline(cin, s) |
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 中所含的字符完全一样,则他们相等; |
s1!=s2 | (接上)string 对象的相等性判断对字母大小写敏感 |
<, <=, >, >= | 利用字符在字典中的顺序进行比较,大小写敏感 |
ps :cin 输入遇到空格停止,有时希望在最终得到的字符串中保留空格,这时应该用 getline 函数代替。getline 从输入流中读取内容,知道遇到换行符为止(注意换行符也被读进来了),然后把所读内容存入 string 对象中(注意不存换行符)。
ps2:对于 size 函数来说,返回的是一个 string::size_type 类型的值。这是一个无符号类型的值,而且能足够存放下任何 string 对象的大小。因此在c++11新标准中,最好通过auto来推断类型变量,比如:
auto len = line.size(); // len 的类型是 string::size_type
由于size函数返回的是一个无符号整形数,因此切记,如果在表达式中混用了带符号数和无符号数可能产生意想不到的效果。例如,假设 n 是一个具有负值的 int,则表达式 s.size()<n 的判断结果几乎肯定是 true。这是因为负值 n 会自动地转换成一个比较大的无符号值。
ps3:字面值和 string 对象相加,当把 string 对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加号(+)的两侧的运算对象至少有一个是 string。因为某些历史原因,也为了与C兼容,所以C++语言中的字符串字面值并不是标准库类型 string 对象。切记,字符串字面值与 string 是不同的类型。
3. 处理 string 对象中的字符
指令 | 解释 |
---|---|
isalnum() | 字母或数字为真 |
isalpha() | 字母为真 |
iscntrl() | 控制字符为真 |
isdigit() | 数字为真 |
isgraph() | 不是空格但可以打印为真 |
islower() | 小写字母为真 |
isprint() | 可打印字符为真(即空格或具有可视形式 ) |
ispunct() | 标点符号为真(即c不是控制字符、数字、字母、可打印空白中的一种) |
isspace() | 空白为真(即空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种) |
issupper() | 大写字母为真 |
isxdigit() | 十六进制数字为真 |
tolower() | 如果是大写字母,输出对应的小写字母;否则原样输出 |
toupper() | 如果是小写字母,输出对应的大写字母;否则原样输出 |
ps:当处理每个字符的时候,可以使用基于范围的for 语句,其语法形式是:
for(declaration: expression)
statement
其中,expression是一个对象,用于表示一个序列;declaration部分定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。
例子:
string str("some string")
for (auto c : str)
cout << c << endl;
如果有python经验,那么很容易就看出来跟python里的for 循环非常像。
4. 改变 string 的其他方法
指令 | 解释 |
---|---|
s.insert(pos, args) | 在pos 之前插入args指定的字符。pos可以是一个下标或一个迭代器。接受下标的版本返回一个指向s 的引用,接受迭代器的版本返回指向第一个插入字符的迭代器 |
s.erase(pos, len) | 删除从位置 pos 开始的 len 个字符。如果 len 被省略,则删除从 pos 开始直至末尾的所有字符。返回一个指向 s 的引用 |
s.assign(args) | 将 s 中的字符替换为 args 制定的字符。返回一个指向 s 的引用 |
s.append(args) | 将 args 追加到 s 。返回一个指向 s 的引用 |
s.replace(range, args) | 删除 s 中范围 range 内的字符,替换为 args 指定的字符。range 或者是一个下标和一个长度,或者是一对指向 s 的迭代器。返回一个指向 s 的引用。 |
5. string 搜索操作
指令 | 解释 |
---|---|
s.find(args) | 查找 s 中 args 第一次出现的位置 |
s.rfind(args) | 查找 s 中 args 最后一次出现的位置 |
s.find_first_of(args) | 在 s 中查找 args 中任何一个字符第一次出现的位置 |
s.find_last_of(args) | 在 s 中查找 args 中任何一个字符最后一次出现的位置 |
s.find_first_not_of(args) | 在 s 中查找第一个不在 args 中的字符 |
s.find_last_not_of(args) | 在 s 中查找最后一个不在 args 中的字符 |
上表中 ( ) 内的参数 | 解释 |
---|---|
c, pos | 从 s 中位置 pos 开始查找字符 c。pos 默认 0 |
s2, pos | 从 s 中位置 pos 开始查找字符串 s2。pos 默认 0 |
cp, pos | 从 s 中位置 pos 开始查找指针 cp 指向的以空字符结尾的 C 风格字符串。pos 默认 0 |
cp, pos ,n | 从 s 中位置 pos 开始查找指针 cp 指向的数组的前 n 个字符。pos 和 n 无默认值 |
ps:每个搜索操作都返回一个 string::size_type 值,表示匹配发生位置的下标。如果搜索失败,则返回一个名为 string::npos 的 static 成员。由于 npos 是一个 unsigned 类型,此初始值意味着 npos 等于任何 string 最大的可能大小。
6. compare 函数
标准库 String 类型还提供了 compare 函数,与 C 中的 strcmp 函数很相似。
s.compare(args);
函数 ( ) 内的参数 | 解释 |
---|---|
s2 | 比较 s 和 s2 |
pos1, n1 ,s2 | 将 s 中从 pos1 开始的 n1 个字符与 s2进行比较 |
pos1, n1, s2, pos2, n2 | 将 s 中从 pos1 开始的 n1 个字符与 s2 中从 pos2开始的 n2 个字符进行比较 |
cp | 比较 s 与 cp 指向的以空字符结尾的字符数组 |
pos1, n1, cp | 将 s 中从 pos1 开始的 n1 个字符与 cp 指向的以空字符结尾的字符数组进行比较 |
pos1, n1, cp, n2 | 将 s 中从 pos1 开始的 n1 个字符与指针 cp 指向的地址开始的 n2 个字符进行比较 |
7.数值转换
指令 | 解释 |
---|---|
to_string(val) | 一组重载函数,返回数值 val 的 string 表示。val 可以是任何算数类型。 |
stoi(s, p, b) | 返回 s 的起始子串(表示整数内容)的数值,返回类型为 int。 |
stol(s, p, b) | 返回类型为 long |
stoul(s, p, b) | 返回类型为 unsigned long |
stoll(s, p, b) | 返回类型为 long long |
stoull(s, p, b) | 返回类型为 unsigned long long |
stof(s, p) | 返回 s 的起始子串(表示浮点数内容)的数值,返回值类型为 float |
stod(s, p) | 返回类型为 double |
stold(s, p) | 返回类型为 long double |
ps:p: 是 size_t 指针,用来保存 s 中第一个非数值字符的下标,p 默认为 0 ,即,函数不保存下标。
b: 是转换所用的基数,默认值为10。
8.迭代器
成员 | 返回值 |
---|---|
begin | 返回指向字符串第一个元素的指针 |
end | 返回指向字符串最后元素下一个位置的指针 |
rbegin | 返回字符串最后一个元素的指针 |
rend | 返回字符串第一个元素前一个位置的指针 |
cbegin | 同begin,只读 |
cend | 同end,只读 |
crbegin | 同rbegin,只读 |
crend | 同rend,只读 |
ps: 反向迭代器执行++操作,也是在反着遍历,比如rbegin指向字符串最后一个字符,rbegin++,此时就指向倒数第二个字符。