C++提高编程 3 STL常用容器 -string容器
3.1 string容器
3.1.1 string基本概念
本质:string是C++风格的字符串,而string本质上是一个类
string和char*区别:
1、char*是一个指针
2、string是一个类,类内封装了char*,管理这个字符串,是一个char*型的容器。
特点:string类内封装了很多成员方法,如查找(find),拷贝(copy),删除(delete),替换(replace),插入(insert);string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
3.1.2 string构造函数
构造函数原型:
string(); //创建一个空的字符串 例如:string str;
string(const char* s); //使用字符串s初始化
string(const string& str); //使用一个string对象初始化另一个string对象
string(int n,char c); //使用n个字符c初始化
#include<iostream> using namespace std; #include <string> //string构造函数 /* string(); //创建一个空的字符串 例如:string str; string(const char* s); //使用字符串s初始化 string(const string& str); //使用一个string对象初始化另一个string对象 string(int n,char c); //使用n个字符c初始化 */ void test1() { string s1; //默认构造 const char* str = "hello world"; string s2(str); cout << "s2 = " << s2 << endl; string s3(s2); cout << "s3 = " << s3 << endl; string s4(10, 'a'); cout << "s4 = " << s4 << endl; } int main() { test1(); system("pause"); return 0; }
3.1.3 string赋值操作
给string赋值,operator=用的比较多,比较实用
赋值的原函数:
string& operator=(const char* s); //char*类型字符串 赋值给当前字符串
string& operator=(const string &s); //把字符串s赋给当前的字符串
string& operator=(char c); //字符赋值给当前的字符串
string& assign(const char *s); //把字符串s赋给当前的字符串
string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s); //把字符串s赋给当前的字符串
string& assign(int n,char c); //用n个字符c赋给当前字符串
#include<iostream> using namespace std; #include <string> //string赋值操作 /* string& operator=(const char* s); //char*类型字符串 赋值给当前字符串 string& operator=(const string &s); //把字符串s赋给当前的字符串 string& operator=(char c); //字符赋值给当前的字符串 string& assign(const char *s); //把字符串s赋给当前的字符串 string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串 string& assign(const string &s); //把字符串s赋给当前的字符串 string& assign(int n,char c); //用n个字符c赋给当前字符串 */ void test1() { string str1; str1 = "hello world!"; cout << "str1 = " << str1 << endl; string str2; str2 = str1; cout << "str2 = " << str2 << endl; string str3; str3 = 'a'; cout << "str3 = " << str3 << endl; string str4; str4.assign("hello C++"); cout << "str4 = " << str4 << endl; string str5; str5.assign("hello C++", 5); cout << "str5 = " << str5 << endl; string str6; str6.assign(str5); cout << "str6 = " << str6 << endl; string str7; str7.assign(5, 'w'); cout << "str7 = " << str7 << endl; } int main() { test1(); system("pause"); return 0; }
3.1.4 string字符串拼接
实现在字符串末尾拼接字符串
函数原型:
string& operator+=(const char* str); //重载+=操作符
string& operator+=(const char c); //重载+=操作符
string& operator+=(const string& str); //重载+=操作符
string& append(const char *s); //把字符串s连接到当前字符串结尾
string& append(const char *s, int n); //把字符串s的前n个字符赋连接到当前的字符结尾串
string& append(const string &s); //同operator+=(const string& str);
string& append(const string& s, int pos, int n); //字符串s中从pos开始的n个字符连接到当前字符串结尾
#include<iostream> using namespace std; #include <string> //string字符串拼接 /* string& operator+=(const char* str); //重载+=操作符 string& operator+=(const char c); //重载+=操作符 string& operator+=(const string& str); //重载+=操作符 string& append(const char *s); //把字符串s连接到当前字符串结尾 string& append(const char *s, int n); //把字符串s的前n个字符赋连接到当前的字符结尾串 string& append(const string &s); //同operator+=(const string& str); string& append(const string& s, int pos, int n); //字符串s中从pos开始的n个字符连接到当前字符串结尾 */ void test1() { string str1 = "我"; str1 += "爱玩游戏"; cout << "str1 = " << str1 << endl; str1 += ':'; cout << "str1 = " << str1 << endl; string str2 = "LOL DNF"; str1 += str2; cout << "str1 = " << str1 << endl; string str3 = "I"; str3.append(" love "); cout << "str3 = " << str3 << endl; str3.append("game abcde", 5); //I love game cout << "str3 = " << str3 << endl; //str3.append(str2); //cout << "str3 = " << str3 << endl; //I love game LOL DNF //str3.append(str2, 0, 3); //cout << "str3 = " << str3 << endl; //I love game LOL str3.append(str2, 4, 3); //I love game DNF //参数1:要截取的字符串 参数2:从哪个位置开始截取 参数3:要截取的字符个数 cout << "str3 = " << str3 << endl; } int main() { test1(); system("pause"); return 0; }
3.1.5 string查找与替换
查找:查找指定字符串是否存在
替换:在指定的位置替换字符串
#include<iostream> using namespace std; #include <string> //string字符串查找与替换 /* int find(const string& str, int pos = 0) const; //查找str第一次出现的位置,从pos开始查找 int find(const char *c, int pos = 0) const; //查找s第一次出现的位置,从pos开始查找 int find(const char *c, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置 int find(const char c, int pos = 0) const; //查找字符c第一次出现的位置 int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找 int rfind(const char *s, int pos = npos) const; //查找s最后一次位置,从pos开始查找 int rfind(const char *c, int pos, int n) const; //从pos位置查找s的前n个字符最后一次位置 int find(const char c, int pos = 0) const; //查找字符c最后一次出现的位置 string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str string& replace(int pos, int n, const char *s); //替换从pos开始的n个字符为字符串s */ //1、查找 void test1() { string str1 = "abcdefg"; int pos = str1.find("de"); cout << "pos = " << pos << endl; } int main() { test1(); system("pause"); return 0; }
因为是从第0位开始查找。a(0)、b(1)、c(2)、d(3)
若查到字符串的位置,就返回位置;若未查到,返回-1
#include<iostream> using namespace std; #include <string> //string字符串查找与替换 /* int find(const string& str, int pos = 0) const; //查找str第一次出现的位置,从pos开始查找 int find(const char *c, int pos = 0) const; //查找s第一次出现的位置,从pos开始查找 int find(const char *c, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置 int find(const char c, int pos = 0) const; //查找字符c第一次出现的位置 int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找 int rfind(const char *s, int pos = npos) const; //查找s最后一次位置,从pos开始查找 int rfind(const char *c, int pos, int n) const; //从pos位置查找s的前n个字符最后一次位置 int find(const char c, int pos = 0) const; //查找字符c最后一次出现的位置 string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str string& replace(int pos, int n, const char *s); //替换从pos开始的n个字符为字符串s */ //1、查找 void test1() { string str1 = "abcdefgde"; int pos = str1.find("de"); if (pos == -1) { cout << "未找到字符串" << endl; } else { cout << "pos = " << pos << endl; } //rfind 和find 区别: //rfind从右往左查 find从左往右查 pos = str1.rfind("de"); cout << "pos = " << pos << endl; } int main() { test1(); system("pause"); return 0; }
#include<iostream> using namespace std; #include <string> //string字符串查找与替换 /* int find(const string& str, int pos = 0) const; //查找str第一次出现的位置,从pos开始查找 int find(const char *c, int pos = 0) const; //查找s第一次出现的位置,从pos开始查找 int find(const char *c, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置 int find(const char c, int pos = 0) const; //查找字符c第一次出现的位置 int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找 int rfind(const char *s, int pos = npos) const; //查找s最后一次位置,从pos开始查找 int rfind(const char *c, int pos, int n) const; //从pos位置查找s的前n个字符最后一次位置 int find(const char c, int pos = 0) const; //查找字符c最后一次出现的位置 string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str string& replace(int pos, int n, const char *s); //替换从pos开始的n个字符为字符串s */ //2、替换 void test2() { string str1 = "abcdefgde"; //从1号位置起 将连续3个字符 替换成111111 str1.replace(1, 3, "111111"); cout << "str1 = " << str1 << endl; } int main() { //test1(); test2(); system("pause"); return 0; }
3.1.6 string字符串比较
字符串比较是按字符的ASCII码进行对比
=返回 0 >返回 1 <返回 -1
函数原型:
int compare(const string &s)const; //与字符串s比较
int compare(const char *s)const; //与字符串s比较
#include<iostream> using namespace std; #include <string> //字符串比较 void test1() { string str1 = "gbcdef"; string str2 = "abcdef"; if (str1.compare(str2) == 0) { cout << "str1 = str2" << endl; } else if (str1.compare(str2) == -1) { cout << "str1 比 str2 小" << endl; } else if (str1.compare(str2) == 1) //‘g’的ASCII比‘a’大 { cout << "str1 比 str2 大" << endl; } } int main() { test1(); system("pause"); return 0; }
平时主要比较是否相等,谁大谁小其实无意义。
3.1.7 string字符存取
string中单个字符存取方式有两种
char& operator[](int n); //通过[]方式取字符
char& at(int n); //通过at方式获取字符
#include<iostream> using namespace std; #include <string> //字符串存取 void test1() { string str = "hello"; //1、通过[]方式访问单个字符 for (int i = 0; i < str.size(); i++) //str.size() 可以获取到str的长度 { cout << str[i] << " "; } cout << endl; //2、通过at方式获取字符 for (int i = 0; i < str.size(); i++) { cout << str.at(i) << " "; } cout << endl; //修改单个字符 str[0] = 'x'; //输出xhllo cout << "str = " << str << endl; str.at(1) = 'x'; //输出xxllo cout << "str = " << str << endl; } int main() { test1(); system("pause"); return 0; }
3.1.8 string插入和删除
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c); //在指定位置插入n个字符c
string& erase(int pos, int n = npos); //删除从pos开始的n个字符
#include<iostream> using namespace std; #include <string> //字符串存取 void test1() { string str = "hello"; //插入 str.insert(1, "111"); //h111ello cout << "str = " << str << endl; //删除 str.erase(1, 3); cout << "str = " << str << endl; } int main() { test1(); system("pause"); return 0; }
插入和删除 的起始下标都是从0开始
3.1.9 string子串
从字符串中截取想要的子串
string substr(int pos = 0, int n = npos)const; //返回由pos开始的n个字符组成的字符串
#include<iostream> using namespace std; #include <string> //字符串存取 void test1() { string str1 = "abcdefg"; string str2 = str1.substr(0, 5); cout << "str2 = " << str2 << endl; } //实用操作 void test2() { string email = "zhangsan@sina.com"; //从邮件地址中获取到用户名信息 int pos = email.find("@"); string sName = email.substr(0, pos); cout << "邮箱id为:" << sName << endl; } int main() {
test1(); test2(); system("pause"); return 0; }
灵活运用求子串功能,可以在实际开发中获取到有效信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构