山再高,往上攀,总能登顶!
路再长,走下去,定能到达!
期待小伙伴们的支持与关注!!!
目录
前言:
为什么学习 string ?(1)C 语言中,字符串是以 '? \0 '? 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP 的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。(2) 在 OJ 中,有关字符串的题目基本以 string 的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string ,很少有人去使用 C 库中的字符串操作函数。
string的组成
<1>string是C++标准库的重要组成部分,主要用于字符串处理
<2>使用string库需要在头文件中包括该库 #include<string>
<3>string与char[ ]不同,string实现了高度的封装,可以很方便地完成各种字符串的操作,比如拼接、截取、匹配等等
string的功能
<4>字符串管理:string封装了字符串的存储和管理。它当动处理字符串的内存分配和释放,避免了手动管理内存的麻烦
<5>动态大小调整:string可以根据需要自动调整字符串的大小。在添加或删除字符时,
string会自动调整内部的存储容量,确保足够的空间来容纳字符串
<6>安全性:string提供了一些方法来确保字符串的安全性。例如,它提供了越界访问检查,以避免访问超出字符串范围的字符
<7>迭代器支持:string支持迭代器,可以使用送代器遍历字符串中的字符,进行字符级别的操作<8>兼容性:string是C++标准库的一部分,因此在C++中广泛使用,并且与其他标准库组件和C++语言特性兼容
#include<iostream> #include<string> using namespace std; int main() { //声明一个空字符串 string str1; //使用字符串的字面量初始化字符串 string str2 = "Hello C++"; //使用另一个string的对象初始化字符串 string str3 = str2; //使用部分字符串初始化字符串 string str4 = str2.substr(0, 5); //使用字符数组初始化字符串 const char* arr = "Hello C++"; string str5(arr); //使用重复的字符初始化字符串 string str6(5, 'A'); //使用assign的方式初始化 string str7; str7.assign("Hello C++", 5); cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; cout << str4 << endl; cout << str5 << endl; cout << str6 << endl; cout << str7 << endl; return 0; }
?声明一个空字符串:
?string str1;
? ?字符串的初始化:
? ?<1>使用字符串的字面量初始化字符串
?? ?string str2 = "Hello C++";
? ? <2>使用另一个string的对象初始化字符串
?? ?string str3 = str2;
? ? <3>使用部分字符串初始化字符串
?? ?string str4 = str2.substr(0, 5);
? ? <4>使用字符数组初始化字符串
?? ?const char* arr = "Hello C++";
?? ?string str5(arr);
? ? <5>使用重复的字符初始化字符串? ??string str6(5, 'A');
? ? <6>使用assign的方式初始化字符串
?? ?string str7;
?? ?str7.assign("Hello C++", 5);
运行效果:
主要的功能:
<1>获取字符串的长度(length)
<2>字符串的查找(find)
<3>字符串的追加(append)
<4>字符串的替换(replace)
<5>提取子字符串(substr)
<6>字符串的比较(compare)
<1>length函数:
作用:获取字符串的长度
C++ string中函数?
length()
?等同于?size()
都是返回
?string 长度(单位字节)函数声明#
size_t length()
因为 length 返回的是无符号的整型所以我们用size_t来接收
用 int 来接收也没有关系
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str = "I love you"; size_t rs = str.length(); cout << rs; return 0; }
<2>find函数:
作用:查找源字符串 arr1 中是否包含子串 arr2
find函数的返回值是整数,假如字符串存在包含关系,其返回值必定不等于npos,但如果字符串不存在包含关系,那么返回值一定是npos
函数声明#
str.find();
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str = "you love me"; int rs = str.find("me"); if (rs != str.npos)//如果没找到,返回一个特别的标志c++中用npos表示 { cout << "找到了!!!"; } else { cout << "找不到!!!"; } return 0; }
<3>append函数:
作用:将(字符串/字符) str2?拼接到(字符串/字符) str1 后面
函数声明#
str.append();
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str1 = "Hello"; string str2 = "C++"; string rs = str1.append(",").append(str2); cout << rs << endl; return 0; }
如果要添加其他字符或者字符串我们可以用 ' . ' 运算符将它们连接起来
<4>replace函数:
函数原型#
string replace (size_t pos, size_t len, const string& str);
pos表示要替换的子串在原字符串中的起始位置
len表示要替换的子串的长度
str表示用来替换的字符串
作用:用str替换指定字符串从起始位置pos开始长度为len的字符
函数声明#
str.replace();
函数使用#
(1)
#include<iostream> #include<string> using namespace std; int main() { string str1 = "Hello"; str1.replace(0, 5, "World"); cout << str1 << endl; return 0; }
(2)用迭代器 起始位置 和 结束位置 的将str字符串的内容全部替换
#include<iostream> #include<string> using namespace std; int main() { string str = "Hello"; str = str.replace(str.begin(), str.end(), "#####"); cout << str << endl; return 0; }
<5>substr函数:
函数原型#
string substr (size_t pos, size_t len)
pos表示要截取的子字符串的起始位置
len表示要截取的子字符串的长度
作用:截取字符串
函数声明#
str.substr();
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str = "Hello C++"; string arr = str.substr(6, 3); cout << arr << endl; return 0; }
<6>compare函数:
作用:用于比较两个字符串是否相等
当字符串str1字符串str2相等时,返回?0
当字符串str1小于字符串str2时,返回-1
当字符串str1大于字符串str2时,返回?1函数声明#
arr1.compare();
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string arr1 = "Hello"; string arr2 = "World"; string str1 = "aaa"; string str2 = "aaa"; int rs1 = arr1.compare(arr2); int rs2 = str1.compare(str2); if (rs1 == 0) { cout << "相等" << endl; } else if (rs1 < 0) { cout << "arr1小于arr2" << endl; } else { cout << "arr1大于arr2" << endl; } if (rs2 == 0) { cout << "相等" << endl; } else if (rs2 < 0) { cout << "str1小于str2" << endl; } else { cout << "str1大于str2" << endl; } return 0; }
扩展#
(1)string重载了不等号,所以可以直接使用s1< s2的方式来比较string的大小,比较的规则是按照字典序大小进行比较。
(2)字典序的比较方法是从小到大一个一个比较,一旦遇到不相等的字符就确定大小关系。#include<iostream> #include<string> using namespace std; int main() { string arr1 = "Hello"; string arr2 = "World"; if (arr1>arr2) { cout << "arr1大于arr2" << endl; } else if(arr1<arr2) { cout << "arr1小于arr2" << endl; } else { cout << "相等" << endl; } return 0; }
常用的遍历string的方法有三种
<1>循环枚举下标
<2>auto枚举(其中&表示取引用类型,如果对i修改将会改变原来的值)<3>迭代器
#include<iostream> #include<string> using namespace std; int main() { string arr = "abcdef"; for (int i = 0;i<arr.length();i++)//循环枚举下标 cout << arr[i] << " " ; cout << "\n"; for (auto i : arr)//auto枚举 { cout << i << " "; } cout << "\n"; string::iterator rs = arr.begin();//迭代器 while (rs != arr.end()) { cout << *rs++ << " "; } cout << "\n"; return 0; }
push_back: (重点) 尾插
insert:(重点)?头插
erase: 删除指定位置的数据
insert函数:
函数原型#
basic_string& insert (size_type pos, const basic_string& str);
作用:在原串下标为pos的字符前插入字符串str
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str = "World"; str.insert(0, "Hello "); cout << str << endl; return 0; }
push_back函数:
作用:将一个字符添加到字符串,位置为当前最后一个元素的下一个元素
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str = "Hello"; for (int i = 0; i < 6; i++) { string arr = " World"; str.push_back(arr[i]); } cout << str << endl; return 0; }
erase函数:
函数原型#
string& erase ( size_t pos, size_t n );
作用:删除字符串从pos位置开始的n个字符
函数使用#
#include<iostream> #include<string> using namespace std; int main() { string str = "Hello World"; str.erase(6, 5); cout << str << endl; return 0; }
上面已经对string进行了简单的介绍,大家只要能够正常使用即可
string的功能强大,不仅拥有很多库函数,还可以使用迭代器和auto提高了编程速度。我们在刷一些算法题的时候string往往是最优解,所以大家就冲冲冲拿下string!!!
?