C++ String 学习

时间:2020-03-27
本文章向大家介绍C++ String 学习,主要包括C++ String 学习使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

内容大多来源于C语言中文网Xdut博客,我只摘录部分在算法竞赛中使用频率相对较高的内容。

String类:其底层是一种顺序表的结构,元素是char类型的字符.

1.构造函数

string  s1—— 构造空的string类对象,即空字符串
string  str("ABC")—— 等价于 str="ABC"
string  str(strlen,'A')——存储 strlen 个 'A' 到 str 中
string  str("ABC",stridx,strlen)—— 等价于 "ABC" 的stridx 位置,作为字符串开头,存到str中,最多存储 strlen 个字节

1 string s1();  // si = ""
2 string s2("Hello");  // s2 = "Hello"
3 string s3(4, 'K');  // s3 = "KKKK"
4 string s4("12345", 1, 3);  //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串
5 string s5(s4) //等价于s5 = s4

2. 对 string 对象赋值

可以用 char* 类型的变量、常量,以及 char 类型的变量、常量对 string 对象进行赋值。

string s1;
s1 = "Hello";  // s1 = "Hello"
s2 = 'K';  // s2 = "K”

string 还有 assign成员函数,其返回对象自身的引用。

str.assign("ABC")——清空字符串,并设置为 "ABC"
str.assign("ABC",2)——清空字符串,并设置为"AB",保留两个字符
str.assign("ABC",1,1)——清空字符串,设置为 "ABC" 中的从 位置1 开始,保留 1个 字符
str.assign(5,'A')——清空字符串,然后字符串设置为 5个 'A'

string s1("12345"), s2;
s3.assign(s1);  // s3 = s1
s2.assign(s1, 1, 2);  // s2 = "23",即 s1 的子串(1, 2)
s2.assign(4, 'K');  // s2 = "KKKK"
s2.assign("abcde", 2, 3);  // s2 = "cde",即 "abcde" 的子串(2, 3)

3. 常用成员函数~

通过str.length() 和 str.size()可以查看字符串长度

str.swap(str1) 交换 str1 和 str 的字符串

str.push_back('A') 在str末尾添加一个字符  'A' ,参数必须是字符形式

str.append("ABC") 在str末尾添加一个字符串 "ABC",参数必须是字符串形式,并返回对象自身的引用。

1 string s1("123"), s2("abc");
2 s1.append(s2);  // s1 = "123abc"
3 s1.append(s2, 1, 2);  // s1 = "123abcbc"
4 s1.append(3, 'K');  // s1 = "123abcbcKKK"
5 s1.append("ABCDE", 2, 3);  // s1 = "123abcbcKKKCDE",添加 "ABCDE" 的子串(2, 3)
6 s1.length() //3
7 s1.push_back('A') // s1 = "123abcbcKKKA"

4.插入字符串

insert 成员函数可以在 string 对象中插入另一个字符串,返回值为对象自身的引用。

str.insert(2,3,'A')——在str下标为2的位置添加 3个 字符'A'
str.insert(2,"ABC")——在str下标为2的位置添加 字符串 "ABC"
str.insert(2,"ABC",1)——在str下标为2的位置添加 字符串 "ABC" 中 1个 字符
str.insert(2,"ABC",1,1)——在str下标为2的位置添加 字符串 "ABC" 中从位置 1 开始的 1 个字符

1 string s1("Limitless"), s2("00");
2 s1.insert(2, "123");  //在下标 2 处插入字符串"123",s1 = "Li123mitless"
3 s1.insert(3, s2);  //在下标 2 处插入 s2 , s1 = "Li10023mitless"
4 s1.insert(3, 5, 'X');  //在下标 3 处插入 5 个 'X',s1 = "Li1XXXXX0023mitless"

5.删除和替换字符串

replace 成员函数可以对 string 对象中的子串进行替换,返回值为对象自身的引用。

string s1("Real Steel");
s1.replace(1, 3, "123456", 2, 4);  //用 "123456" 的子串(2,4) 替换 s1 的子串(1,3)
cout << s1 << endl;  //输出 R3456 Steel
string s2("Harry Potter");
s2.replace(2, 3, 5, '0');  //用 5 个 '0' 替换子串(2,3)
cout << s2 << endl;  //输出 HaOOOOO Potter
int n = s2.find("OOOOO");  //查找子串 "00000" 的位置,n=2
s2.replace(n, 5, "XXX");  //将子串(n,5)替换为"XXX"
cout << s2 < < endl;  //输出 HaXXX Potter

erase 成员函数可以删除 string 对象中的子串,返回值为对象自身的引用。

string s1("Real Steel");
s1.erase(1, 3);  //删除子串(1, 3),此后 s1 = "R Steel"
s1.erase(5);  //删除下标5及其后面的所有字符,此后 s1 = "R Ste"

6.String的比较

除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:

  • 小于 0 表示当前的字符串小;
  • 等于 0 表示两个字符串相等;
  • 大于 0 表示另一个字符串小。
string s1("hello"), s2("hello, world");
//compare返回值为int值
int n = s1.compare(s2);
//比较s1的子串 (1,2) 和s2的子串 (0,3)
n = s1.compare(1, 2, s2, 0, 3);  
// 比较s1的子串 (0,2) 和 s2
n = s1.compare(0, 2, s2);  
//比较s1与字符串"Hello"
n = s1.compare("Hello");
//比较 s1 的子串(1,2)和"Hello”
n = s1.compare(1, 2, "Hello");  
//比较 s1 的子串(1,2)和 "Hello" 的子串(1,2)
n = s1.compare(1, 2, "Hello", 1, 2);  

7.查找字符和子串

查找成功返回位置 ,查找失败,返回-1

find函数:从头查找

  • str.find('A')——查找 'A'
  • str.find("ABC")——查找 "ABC"
  • str.find('B',1)——从 位置1 处,查找'B'
  • str.find("ABC",1,2)——从 位置1 处,开始查找 'ABC' 的前 2个 字符

rfind函数:从尾部查找

  • str.rfind('A')——查找 'A'
  • str.rfind("ABC")——查找 "ABC"
  • str.rfind('B',1)——从 位置1 处,向前查找'B'
  • str.rfind("ABC",1,2)——从 位置1 处,开始向前查找 'ABC' 的前 2个 字符

find_first_of()函数: 查找是否包含有子串中任何一个字符

  • str.find_first_of("abBc")——查找 "abBc" 和str 相等的任何字符,"abBc" 中有就返回位置
  • str.find_first_of("abBc",1)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始查找"abBc" 中的字符,"abBc" 中有的就返回位置
  • str.find_first_of("abBc",1,2)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始查找"abBc" 的前 2个 字符,"abBc" 中有的就返回位置

find_last_of()函数:find_first_not_of ()末尾查找, 从末尾处开始,向前查找是否包含有子串中任何一个字符

  • str.find_last_of("abBc")——查找 "abBc" 和str 相等的任何字符,向前查找,"abBc" 中有的返回位置
  • str.find_last_of("abBc",1)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始向前查找"abBc" 中的字符,"abBc" 中有的就返回位置
  • str.find_last_of("abBc",10,2)——查找 "abBc" 和str 相等的任何字符,从 位置10 处,开始向前查找"abBc" 的前 2个 字符,"abBc" 中有的就返回位置

当然还有非常厉害的正则表达式匹配法。。。但在算法竞赛中这些功能速度较慢,在有些情况下会超时。

8.求 string 对象的子串

str1=str.substr(2) 提取子串,提取出 str 的 下标为2 到末尾,给 str1

str1=str.substr(2,3) 提取子串,提取出 str 的 下标为2 开始,提取三个字节,给 str1

string s1 = "this is ok";
string s2 = s1.substr(2, 4);  // s2 = "is i"
s2 = s1.substr(2);  // s2 = "is is ok"

要记住substr的参数不是 L和R而是 L, length.效果是 取出[L,L + length)的子串

常用算法

reverse(str.begin(),str.end()) 可以将str反转



原文地址:https://www.cnblogs.com/LYFer233/p/12581441.html