当前位置: 代码迷 >> 综合 >> STL Unit 1 String容器
  详细解决方案

STL Unit 1 String容器

热度:7   发布时间:2023-12-04 03:34:44.0

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;}

  相关解决方案