STL-String类
程序员文章站
2022-03-23 14:59:09
...
目录
1.使用string类必须包含头文件<string>
#include<string>
2.string的输入赋值与输出
- 使用 cin 进行赋值,cout 输出
- 使用 getline 进行赋值
- 无法直接使用 scanf,printf 进行赋值,输出
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
getline(cin, s);
cout << s << '\n';
cin >> s;
cout << s << '\n';
return 0;
}
值得注意的是:当 getline 与 cin 同用时(如上),其使用顺序对结果会造成影响,原因是 getline 与 cin 对读入换行符(空白符)的不同的处理方式。
若想使用 scanf 对 string 输入赋值:
string a;
a.resize(100); // 需要预先分配空间
scanf("%s", &a[0]); // 输入
printf("%s\n",a.c_str()); // 输出
3.string的常用构造函数
- string s :生成空字符串
- string s(str) :复制字符串 str
- string s(str, stridx) :将字符串 str 中始于 stridx 的部分作为构造函数的初值
- string s(str, strbegin, strlen) :将字符串 str 中始于strbegin、长度为 strlen 的部分作为字符串初值
- string s(num, c) :生成一个字符串,包含 num 个 c 字符
- string s(str, beg, end) :以区间 [beg, end] 内的字符作为字符串 s 的初值(begin, end与 第四条不同)
- string s(chs) :生成一个与 chs[] 字符数组一样的字符串
- string s(chs[, begin], len) :生成一个值为 chs[] 字符数组由 begin (默认值0) 开始的 len 个字符的字符串
#include<string>
#include<iostream>
using namespace std;
int main()
{
char ch[] = "newString";
string str ("123456789");
string str1; // 定义一个空字符串
string str2(str); // 复制
string str3(str, 7); // 从位置 7 开始,到结束
string str4(str, 0, 7); // 从第 0 个位置开始,复制 7 个字符
string str5(7,'7'); // 将字符 '7' 重复 7 次
string str6(str.begin() + 1, str.end() - 1); // str 去除首尾
string str7(ch); // 复制 ch 数组
string str8(ch, 7); // ch 的前 7 个元素
cout << "str1:" << str1 << endl;
cout << "str2:" << str2 << endl;
cout << "str3:" << str3 << endl;
cout << "str4:" << str4 << endl;
cout << "str5:" << str5 << endl;
cout << "str6:" << str6 << endl;
cout << "str7:" << str7 << endl;
cout << "str8:" << str8 << endl;
return 0;
}
/*
输出:
str1:
str2:123456789
str3:89
str4:1234567
str5:7777777
str6:2345678
str7:newString
str8:newStri
*/
对于构造函数的第 4 条、第 6 条和第 8 条需要区分开来。
4.字符串获取长度
- size() :获取字符串的字符个数
- length() :获取字符串的字符个数
- capacity() :在当前内存分配中,可容纳的最大字符数(若超过,会继续分配)
- max_size() :字符串对象最多可容纳字符数(超过就会报错)
- resize(len[, c]) :若 len 小于原字符串长度,相当于截取;反之用字符 c (默认为空格)填充;影响 size、length
- reserve(len) :预分配 len 空间给字符串;影响 capacity
注:resize() 也可能影响 capacity,例,其参数大于当前 capacity,会继续分配,导致
#include<string>
#include<iostream>
using namespace std;
void printSize(string s)
{
cout << "s: \"" << s << "\"\n";
cout << "size: " << s.size() << endl;
cout << "length: " << s.length() << endl;
cout << "capacity: " << s.capacity() << endl;
cout << "max_size: " << s.max_size() << endl << endl;
}
int main()
{
string str ("123456789");
printSize(str);
/*
s: "123456789"
size: 9
length: 9
capacity: 9
max_size: 1073741820
*/
str.resize(15);
printSize(str);
/*
s: "123456789 "
size: 15
length: 15
capacity: 15
max_size: 1073741820
*/
str.reserve(20);
printSize(str);
/*
s: "123456789 "
size: 15
length: 15
capacity: 20
max_size: 1073741820
*/
str.resize(30, 'a');
printSize(str);
/*
s: "123456789 aaaaaaaaaaaaaaa"
size: 30
length: 30
capacity: 30
max_size: 1073741820
*/
return 0;
}
5. 字符串元素访问
- 使用[ ]下标访问
- 使用函数 at()
相同点:在字符串可访问范围内 [0, length(s) - 1],两种方式一样;
不同点:在访问字符串越界时,使用 [ ] 访问不会报错;使用 at() 会发生错误(即 at 函数会检查下标有效性);
6.字符串比较(按字典序比较,排前的算小的)
- 使用运算符:==、!=、<、<=、>、>=
- 使用函数compare():相等返回 0,小于返回负数,大于返回正数
compare()的几种常见形式:
1. A.compare(B):A 与 B 进行比较
2. A.compare(pos, n, B):A.substr(pos, n) 与 B 进行比较
3. A.compare(pos, n, B, pos2, n2):A.substr(pos, n) 与 B.substr(pos2, n2) 进行比较
#include<string>
#include<iostream>
using namespace std;
int main()
{
string a("abcDEF123");
string b("123abcDEF");
cout << "a.compare(b): " << a.compare(b) << endl;
cout << "a.compare(6, 3, b): " << a.compare(6, 3, b) << endl;
cout << "a.compare(3, 3, b, 6, 3): " << a.compare(3, 3, b, 6, 3) << endl;
return 0;
}
/*
输出:
a.compare(b): 1
a.compare(6, 3, b): -6
a.compare(3, 3, b, 6, 3): 0
*/
7. 字符串修改
- erase():删除
- swap():交换
- insert():插入
- append():追加(+=)
- replace():替换
- substr():截取
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
string a, b;
// erase(pos[, n]): 从 pos 开始删除 n 个元素, 不指定 n 则删除至末尾
s = "123456789";
s.erase(3, 2);
cout << s << endl;
s = "123456789";
s.erase(3);
cout << s << endl;
// 交换字符串
a = "abc";
b = "123";
a.swap(b);
cout << a << '\t' << b << endl;
// substr(pos[, n]): 从 pos 开始截取 n 个元素, 不指定 n 则截取至末尾
s = "123456789";
s = s.substr(3, 5);
cout << s << endl;
s = "123456789";
s = s.substr(3);
cout << s << endl;
// 追加字符串
a = "abc";
b = "123";
a.append(b);
cout << a << '\t' << b << endl;
// replace(pos, n, str): 用 str 代替原字符串从 pos 开始的 n 个字符
s = "123456789";
s = s.replace(3, 5, "abc");
cout << s << endl;
// insert(pos, str): 将 str 插入原字符串的 pos 位置
s = "123456789";
s = s.insert(7, "abc");
cout << s << endl;
return 0;
}
以上例子仅为较常用的例子,部分方法还有其他的重载方法。
8.字符串查找
- find(str[, n]):从左开始,查找第一次出现的位置,没找到返回 npos/-1(实际上 npos != -1,但是 npos == unsigned(-1))
- rfind(str[, n]):从右开始,查找第一次出现的位置
- find_first_of(str[, n]):查找第一次出现的位置
- find_last_of(str[, n]):查找最后一次出现的位置
- find_first_not_of(str[, n]):查找第一个不是指定字符/字符串的位置
- find_last_not_of(str[, n]):查找最后一个不是指定字符/字符串的位置
以上的 str 可以是字符串,也可以是字符,若指定了 n 则从位置 n 开始查找
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s = "0123456789876543210";
if (s.find('g') == -1)
cout << "unsigned(-1): " << unsigned(-1) << endl;
cout << "s: " << s << endl;
cout << "s.find('a'): " << s.find('a') << endl;
cout << "s.npos: " << s.npos << endl;
cout << "s.find(\"56\"): " << s.find("56") << endl;
cout << "s.rfind(\"3\"): " << s.rfind("3") << endl;
cout << "s.find('3', 5): " << s.find('3', 5) << endl;
cout << "s.find_first_of('3'): " << s.find_first_of('3') << endl;
cout << "s.find_last_of('3'): " << s.find_last_of('3') << endl;
cout << "s.find_first_not_of('3'): " << s.find_first_not_of('3') << endl;
cout << "s.find_last_not_of('3'): " << s.find_last_not_of('3') << endl;
return 0;
}
更多和更加详细的内容请参考下面的网站!!
上一篇: Java 参数后面跟三个... 的作用
下一篇: JAVA中类型后面跟三个点