1. string 容器
1.1 string概念
本质:
string是C++风格的字符串,而string本质上是一个类。
string和char * 区别:
char * 是一个指针 ,string是一个类,类内部封装了char *,管理这个字符串,是一个char *型的容器。
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。
1.2 构造函数
函数原型:
函数原型 | 功能 |
string(); | 创建一个空的字符串。 |
string(const char* s); | 使用字符串s初始化。 |
string(const string& str); | 使用一个string对象初始化另一个string对象。 |
string(int n, char c); | 使用n个字符c初始化。 |
代码示例
#include <iostream>
#include<string>
using namespace std;int main()
{string s1; //创建一个空的字符串。const char* str = "Hello C++"; // string(const char* s); 使用字符串s初始化。string s2(str); cout << s2 << endl;string s3(s2); // 使用一个string对象初始化另一个string对象。cout << s3 << endl; string s4(10,'a'); //使用10个字符‘a’初始化cout << s4 << endl;
}
1.3 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赋给当前字符串。 |
代码示例
#include <iostream>
#include<string>
using namespace std;int main()
{string str1;str1 = "Hello C++";cout << str1 << endl;string str2;str2 = str1; cout << str2 << endl; // 把字符串s赋给当前的字符串string str3;str3 = 'a'; cout << str3 << endl; //字符赋值给当前的字符串/* string str4;str4.assign("Hello C++"); cout << str4 << endl; // 把字符串s赋给当前的字符串 */ // 个人认为不如直接 str4 = "Hello C++";string str5;str5.assign("Hello C++", 4); cout << str5 << endl; //把字符串s的前n个字符赋给当前的字符串 注意是赋给// 不能写成 str5.assign(str1, 4); 原因 见函数原型 //函数原型 string& assign(const char *s, int n);// 与下面的append 拼接做好区分/* string str6;str6.assign(str5); //把字符串s赋给当前字符串 cout << str6 << endl; //这里建议 str6 = str5; 比较简便*/string str7;str7.assign(10,'w'); cout << str7 << endl; //用n个字符c赋给当前字符串}
1.4 string字符串拼接
实现字符串末尾拼接字符串的函数原型:
函数原型 | |
string& operator+=(const char* str); | 重载+=操作符。 |
string& operator+=(const char c); | 重载+=操作符。 |
tring& operator+=(const string& str); | 重载+=操作符。 |
string& append(const char *s); | 把字符串s连接到当前字符串结尾。 |
string& append(const char *s, int n); | 把字符串s的前n个字符连接到当前字符串结尾。 |
string& append(const string &s); | 把字符串s连接到当前字符串结尾。 |
string& append(const string &s, int pos, int n); | 字符串s中从pos开始的n个字符连接到字符串结尾。 |
示例:
#include<iostream>
#include<string>
using namespace std;int main()
{string s1="欢迎";s1+="学习"; //重载+=操作符cout<<s1<<endl;s1+=':'; //重载+=操作符cout<<s1<<endl;string s2="STL";s1+=s2; // 重载+=操作符 s1="欢迎学习:STL";cout<<s1<<endl;string s3="I ";s3.append("want to"); // 把字符串s连接到当前字符串结尾cout<<s3<<endl;s3.append(" be an acmer abcd",12); // 把字符串s的前n个字符连接到当前字符串结尾 空格也算cout<<s3<<endl;s3.append(s1); //把字符串s连接到当前字符串结尾cout<<s3<<endl;s3.append(s2,0,3); // 字符串s中从pos开始的n个字符连接到字符串结尾 从第0位开始数cout<<s3<<endl;}
1.5 string查找和替换
函数原型:
函数模型 | 功能 |
int find(const string& str, int pos = 0) const; | 查找str第一次出现位置,从pos开始查找。 |
int find(const char* s, int pos = 0) const; | 查找s第一次出现位置,从pos开始查找。 |
int find(const char* s, 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* s, int pos, int n) const; | 从pos查找s的前n个字符最后一次位置。 |
int rfind(const char c, int pos = 0) const; | 查找字符c最后一次出现位置。 |
示例:
#include<iostream>
#include<string>
using namespace std;int main()
{string s1="hello acm acm";int pos1 =s1.find("cm"); //未找到即返回-1 cout<<pos1<<endl;int pos2=s1.find("cm",7,2); //从pos (1) 位置查找s (cm) 的前n (1) 个字符第一次位置。cout<<pos2<<endl;int pos3=s1.rfind("acm"); //查找s最后一次出现位置,从pos开始查找。cout<<pos3<<endl;string s2="acm";int pos4=s1.rfind(s2); //查找str最后一次位置,从pos开始查找。cout<<pos4<<endl; }
在指定的位置替换字符串的函数模型:
函数原型 | 功能 |
string& replace(int pos, int n, const string& str); | 替换从pos开始n个字符为字符串str。 |
string& replace(int pos, int n,const char* s); | 替换从pos开始的n个字符为字符串s。 |
#include<iostream>
#include<string>
using namespace std;int main()
{string s1="abcdef";string s2;s2=s1.replace(0,3,"1111");//从0开始的三个字符替换第0位也算1一个数 1111def cout<<s2<<endl;]
1.6 string字符串比较
比较字符串大小的函数模型:
函数模型 | 功能 |
int compare(const string &s) const; | 与字符串s比较。 |
int compare(const char *s) const; | 与字符串s比较。 |
示例:
#include<iostream>
#include<string>
using namespace std;int main()
{string s1 = "hello";string s2 = "hello";//与字符串s比较 if (s1.compare(s2) == 0) cout << "=" << endl;else if (s1.compare(s2) > 0) cout << ">" << endl;else cout << "<" << endl;}
1.7 string字符存取
string中单个字符存取的函数模型:
下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。
函数 at() 在使用时会检查下标是否有效,并给出提示 out_of_range 异常
#include<iostream>
#include<string>
using namespace std;int main()
{string s1="succes need patient";for(i=0;i<s1.size();i++){cout <<s1[i]<<endl; // cout<<s1.at[i]<<endl;}cout<<endl;s1[0]='S'; //s1.at[0]='S';cout<<s1<<endl;char c=s1[0]; //char c=s.at[0]cout<<c<<endl;}
1.8 string插入和删除
对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个字符。 |
示例:
插入和删除的起始下标都是从0开始
。
#include <iostream>
#include<string>
using namespace std;int main()
{string str = "hello";str.insert(1,"111"); //插入字符串 在e前面插入111 即h111ello cout << str << endl;str.erase(1,3);// 删除从Pos开始的n个字符cout << str << endl;str.insert(1,5,'1');// 插入从Pos开始的n个字符 即h11111ellocout << str << endl;
}
1.9 string子串
函数模型 | 功能 |
string substr(int pos = 0, int n = npos) const; | 返回由pos开始的n个字符组成的字符串。 |
示例:
#include<iostream>
#include<string>
using namespace std;int main()
{string s1="icpc acm"; string s2=s1.substr(4,4); // 编号从0开始 从4号即空格开始 取4个cout<<s2<<endl; // 输出 acm ac前有空格//配合 find 实现对某种格式获取string s3="acmicpc@163.com";int pos=s3.find('@');string s4=s3.substr(0,pos);cout<<s4<<endl;}