【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)

1. string容器 简介

(1)string是C++风格的字符串,而string本质上是一个类。
(2)string 和 char* 区别:①char* 是一个指针
                                            ② string 是一个类,类内部封装了 char*,管理这个字符串是一个char型容器。
(3)string特点:①string类内部封装了很多成员方法, 例如,查找find,拷贝copy,删除delete,替换replace,插入insert。
                             ②string管理char* 所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。

2. string类常用的操作函数

1) =,assign()   //赋以新值

2) swap()   //交换两个字符串的内容

3) +=,append(),push_back() //在尾部添加字符

4) insert() //插入字符

5) erase() //删除字符

6) clear() //删除全部字符

7) replace() //替换字符

8) + //串联字符串

9) ==,!=,<,<=,>,>=,compare()  //比较字符串

10)size(),length()  //返回字符数量

11) max_size() //返回字符的可能最大个数

12) empty()  //判断字符串是否为空

13) capacity() //返回重新分配之前的字符容量

14) reserve() //保留一定量内存以容纳一定数量的字符

15) [ ], at() //存取单一字符

16) >>,getline() //从stream读取某值

17) <<  //将谋值写入stream

18) copy() //将某值赋值为一个C_string

19) c_str() //将内容以C_string返回

20) data() //将内容以字符数组形式返回

21) substr() //返回某个子字符串

22) find()查找函数

23) begin() end() //提供类似STL的迭代器支持

24) rbegin() rend() //逆向迭代器

25) get_allocator() //返回配置器

3. 构造函数

(1) string构造函数原型:

1. string();   //  创建一个空的字符串 例如:string str;
2. string(const char * s);    // 使用字符串s初始化
3. string(const string & str);  // 使用一个string对象初始化另一个string对象
4. string(int n,char c);  // 使用n个字符c初始化

(2)string的多种构造方式没有可比性,灵活使用即可。

#include <stdlib.h>
#include <iostream>
#include <string> 

using namespace std;

//string的构造函数

/*
 *1. string();   //  创建一个空的字符串 例如:string str;
 *2. string(const char* s);    // 使用字符串str初始化
 *3. string(const string & str);  // 使用一个string对象初始化另一个string对象
 *4. string(int n, char c);  //使用n个字符c初始化
 */
void test01()
{
    string s1;  //默认构造就是空字符串
    cout << "s1 = " << s1 << endl;

    const char* str = "hello world";   //使用字符串str初始化
    string s2(str);
    cout << "s2 = " << s2 << endl;

    string s3(s2);
    cout << "s3 = " << s3 << endl;

    string s4(10, 'a');
    cout << "s4 = " << s4 << endl;


}

int main()
{
    test01();

    //system("pause");
    //只适合DOS或者windows,不适合Linux
    //在一个程序中写有  system("pause")语句时,就是说从该程序里调用了“pause”命令,
    //即让操作系统来暂停该程序进程的执行,同时程序运行到此语句处时,会在程序的窗口上显示“Press any key to continue . . .” 也就是 “按任意键继续...”,
    //即等待用户按下任意一个按键使该程序从暂停状态返回到执行状态继续从刚才暂停的地方开始执行。
    return 0;
}

运行结果:
在这里插入图片描述

4. 赋值操作

(1)给string字符串进行赋值。
(2)赋值的函数原型:

1. string& operator=(const char* s);  //char * 类型字符串赋值给当前的字符串
2. string& operator=(const strinng &s); //把字符串s赋给当前的字符串
3. string& operator=(char c); //字符赋值给当前的字符串
4. string& assign(const char *s); //把字符串s赋给当前的字符串
5. string& assign(const char *s,int n); //把字符串s的前n个字符赋给当前的字符串
6. string& assign(const string &s); //把字符串s赋给当前字符串
7. string& assign(int n, char c); //用n个字符c赋给当前字符串

(3)string的赋值方式很多,operator=这种方式是比较常用的。

#include <iostream>
#include<string> 

using namespace std;

//string赋值操作

/*
   1. string& operator=(const char* s);  //char * 类型字符串赋值给当前的字符串
   2. string& operator=(const string &s); //把字符串s赋给当前的字符串
   3. string& operator=(char c); //字符赋值给当前的字符串
   4. string& assign(const char *s); //把字符串s赋给当前的字符串
   5. string& assign(const char *s,int n); //把字符串s的前n个字符赋给当前的字符串
   6. string& assign(const string &s); //把字符串s赋给当前字符串
   7. string& assign(int n, char c); //用n个字符c赋给当前字符串
   */

void test02()
{
    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++");   //第一种assign方式
    cout << "str4 = " << str4 << endl;

    string str5;
    str5.assign("hello C++",5);   //第二种assign方式,取字符串"hello C++"中的前五个字符赋值给str5
    cout << "str5 = " << str5 << endl;

    string str6;
    str6.assign(str5);   //第三种assign方式
    cout << "str6 = " << str6 << endl;

    string str7;
    str7.assign(10,'w');   //第四种assign方式
    cout << "str7 = " << str7 << endl;

}

int main()
{
    test02();

    return 0;
}

运行结果:
在这里插入图片描述

5. 字符串拼接

(1) 实现在字符串末尾拼接字符串。
(2)函数原型:

1. string& operator+=(const char* str);  //重载+=操作符
2. 2. string& operator+=(const char c); //重载+=操作符
3. string& operator+=(const string& str); //重载+=操作符
4. string& append+=(const char* s); //把字符串s连接到当前字符串结尾
5. string& append+=(const char* s, int n); //把字符串s的前n个字符连接到当前字符串结尾
6. string& append+=(const string &s); //同operator+=(const string& str)
7. string& append+=(const char &s, int pos, int n); //字符串s从pos开始的n个字符连接到字符串结尾
#include <iostream>
#include<string> 

using namespace std;

//string赋值操作

/*
   1. string& operator+=(const char* str);  //重载+=操作符
   2. string& operator+=(const char c); //重载+=操作符
   3. string& operator+=(const string& str); //重载+=操作符
   4. string& append+=(const char* s); //把字符串s连接到当前字符串结尾
   5. string& append+=(const char* s, int n); //把字符串s的前n个字符连接到当前字符串结尾
   6. string& append+=(const string &s); //同operator+=(const string& str)
   7. string& append+=(const char &s, int pos, int n); //字符串s从pos开始的n个字符连接到字符串结尾
   */

void test03()
{
    string str1 = "我";  //字符串初始化
    str1 += "爱玩游戏";
    cout << "str1 = " << str1 << endl;

    str1 += ':';   //追加一个字符
    cout << "str1 = " << str1 << endl;

    string str2 = " LOL";
    str1 += str2;    //追加字符串
    cout << "str1 = " << str1 << endl;

    string str3 = "I";
    str3.append(" love ");
    cout << "str3 = " << str3 << endl;

    str3.append("game abcde ",4);  //只把字符串的前4个拼接过去
    cout << "str3 = " << str3 << endl;

    str3.append(str2);  
    cout << "str3 = " << str3 << endl;

    str3.append(str2,0,4);  //只截取到LoL,参数2表示从哪个位置开始截取,参数3表示截取字符个数
    cout << "str3 = " << str3 << endl;
}


int main()
{
    test03();

    return 0;
}

运行结果:
在这里插入图片描述

6. 字符串查找和替换

(1)查找:查找指定字符串是否存在。
(2)替换:在指定的位置替换字符串。
(3)函数原型:

1. int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
2.  int find(const char* s, int pos = 0) const;  // 查找s第一次出现位置,从pos开始查找
3. int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置 
4. int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
5.  int rfind(const string& str, int pos = npos) const;  //查找str最后一次位置,从pos开始查找
6.  int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
7. int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
8.  int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
9.  string& replace(int pos, int n, const string& str) const; //替换从pos开始n个字符为字符串str
10.  string& replace(int pos, int n, const string* s) const; //替换从pos开始的n个字符为s

(4) find查找是从左往右,rfind从右往左。
(5) find找到字符串后返回查找的第一个字符位置,找不到返回-1。
(6) replace在替换时,要知道从哪个位置起,多少个字符,替换成什么样的字符串。

#include <iostream>
#include<string> 

using namespace std;

//string查找和替换

/*
//查找str第一次出现位置,从pos开始查找
1. int find(const string& str, int pos = 0) const;
// 查找s第一次出现位置,从pos开始查找
2. int find(const char* s, int pos = 0) const;
//从pos位置查找s的前n个字符第一次位置
3. int find(const char* s, int pos, int n) const;
//查找字符c第一次出现位置
4. int find(const char c, int pos = 0) const;
//查找str最后一次位置,从pos开始查找
5. int rfind(const string& str, int pos = npos) const;
//查找s最后一次出现位置,从pos开始查找
6. int rfind(const char* s, int pos = npos) const;
//从pos查找s的前n个字符最后一次位置
7. int rfind(const char* s, int pos, int n) const;
//查找字符c最后一次出现位置
8. int rfind(const char c, int pos = 0) const;
//替换从pos开始n个字符为字符串str
9. string& replace(int pos, int n, const string& str) const;
//替换从pos开始的n个字符为s
10. string& replace(int pos, int n, const string* s) const;
*/


//1、查找
void test04()
{
    string str1 = "abcdefgde"; 
    int pos = str1.find("de");  //从零开始索引,返回值为d出现的位置"3",若找不到子字符串,就返回-1
    if (pos == -1)
    {
        cout << "未找到字符串 pos = " << pos << endl;
    }
    else
    {
        cout << " pos = " << pos << endl;
    }

    //rfind
    pos = str1.rfind("de");  //rfind是从右往左查找,find是从左往右查找
    cout << " pos = " << pos << endl;

    //rfind
    string str = "123456123456123456";

    pos = str.rfind("123"); //从后往前找,下标一直是从昨往右数的
    cout << " pos = " << pos << endl;;
}

void test05()
{
    string str1 = "abcdefg";

    str1.replace(1, 3, "1111");  // 从 "1" 号位置起,"1111"有四个字符,所以变为4个字符替换成 "1111",而不是出现3个字符替换成"111"

    cout << " str1 = " << str1 << endl;
}

int main()
{
    test04();
    test05();

    return 0;
}

运行结果:
在这里插入图片描述

7. 字符串比较

(1)功能描述:字符串之间比较。
(2)比较方式:字符串比较是按字符的ASCII码进行对比。

1.  = 返回 0
2.  > 返回 1
3.  < 返回 -1

(3) 函数原型:

1. int compare(const string & s) const; //与字符串s比较
2. int compare(const char * s) const;  //与字符串s比较
#include <iostream>
#include<string> 

using namespace std;

//字符串比较

void test06()
{
    string str1 = "hello";
    string str2 = "hello";

    //compar常用于比较两个字符串相等或不相等,判断谁大谁小的意义并不是很大
    if (str1.compare(str2) == 0)
    {
        cout << "str1 等于 str2" << endl;
    }
    else if (str1.compare(str2) > 0)
    {
        cout << "str1 大于 str2" << endl;
    }
    else
    {
        cout << "str1 小于 str2" << endl;
    }


    string str3 = "hello world";
    string str4 = "hello c++";

    if (str3.compare(str4) == 0)
    {
        cout << "str3 等于 str4" << endl;
    }
    else if (str3.compare(str4) > 0)
    {
        cout << "str3 大于 str4" << endl;
    }
    else
    {
        cout << "str3 小于 str4" << endl;
    }
}

int main()
{
    test06();

    return 0;
}

运行结果:
在这里插入图片描述

8. 字符串存取

(1) string中单个字符存取方式有两种:

1. char& operator[](int n); //通过[]方式取字符
2. char& at(int n); //通过at方式取字符
#include <iostream>
#include<string> 

using namespace std;

//string 字符存取

void test07()
{
    string str = "hello";

    cout << "str= " << str << endl;

    //1、通过[]访问单个字符
    for (int i = 0; i < str.size(); i++)
    {
        cout << str[i] << " "; 
    }
    cout << endl; //换行符

    //2、通过at方式访问单个字符
    for (int i = 0; i < str.size(); i++)
    {
        cout << str.at(i) << " ";
    }
    cout << endl;

    //修改单个字符
    str[0] = 'x';
    cout << "str= " << str << endl;

    str.at(1) = 'x';
    cout << "str= " << str << endl;
}

int main()
{
    test07();

    return 0;
}

运行结果:
在这里插入图片描述

9. 字符串插入和删除

(1)功能描述:对string字符串进行插入和删除字符操作。
(2) 函数原型:

1. string& insert(int pos, const char * s);  // 插入字符串
2. string& insert(int pos, const string& str); //插入字符串
3. string& insert(int pos, int n, char c);  //在指定位置插入n个字符c
4. string& erase(int pos, int n = npos);   //删除从Pos开始的n个字符

(3)插入和删除的起始下标都是从0开始。

#include <iostream>
#include<string> 
using namespace std;

//字符串 插入和删除

void test08()
{
    string str = "hello";

    //插入

    str.insert(1, "111");
    //hello
    cout << "str = " << str << endl;

    //删除
    str.erase(1, 3); //从第“1”个位置起,删3个
    cout << "str = " << str << endl;
}



int main()
{
    test08();

    return 0;
}

运行结果:
在这里插入图片描述

10. 子符串获取

(1)功能描述:从字符串中获取想要的子串。
(2) 函数原型:

1. string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字组成的字符串。

(3)灵活的运用求子串功能,可以在实际开发中获取有效的信息。

#include <iostream>
#include<string> 

using namespace std;

//string 求子串

void test09()
{
    string str = "abcdef";

    string subStr = str.substr(1, 3); 

    cout << "subStr = " << subStr << endl;
}

//实用操作
void test10()
{
    string email = "zhangsan@sina.com";

    //从邮件地址中 获取 用户名称

    int pos = email.find("@");
    cout << pos << endl;

    string usrName = email.substr(0, pos);
    cout << usrName << endl;
}

int main()
{
    test09();
    test10();

    return 0;
}

运行结果:
在这里插入图片描述

11. C字符串与string串

string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。
注意,与char不同的是,string不一定以NULL(‘\0’)结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char

11.1 string转换成const char *

如果要将字面值string直接转换成const char*类型。string有2个函数可以运用:一个是.c_str(),一个是data成员函数。
c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成C中的字符串样式。
注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针

string str = "Hello World";
const char *ch1 = str.c_str();
const char *ch2 = str.data();

此时,ch1与ch2的内容将都是”Hello World”。但是只能转换成const char*,如果去掉const编译不能通过。

11.2 string转换成char *

C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中
(1) data()以字符数组的形式返回字符串内容,但并不添加’\0’。
(2)c_str()返回一个以’\0’结尾的字符数组,返回值是const char*。
(3)copy()则把字符串的内容复制或写入既有的c_string或字符数组内。
C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。
如果要转换成char*,可以用string的一个成员函数strcpy实现。

string str = "Hello World";
int len = str.length();
char *data = new char[len+1];  //这里+1还是不+1需要注意
strcpy(data, str.c_str());  // const char *data = new char[len+1];  strcpy(data, str);

此时,data中的内容为”Hello World”使用c_str()要么str赋给一个const指针,要么用strcpy()复制。

11.3 char *转换成string

string类型能够自动将C风格的字符串转换成string对象

string str; 
const char *pc = "Hello World"; 
str = pc;
printf(%s\n”, str);  //此处出现错误的输出
cout<<str<<endl;

不过这个是会出现问题的。有一种情况我要说明一下。当我们定义了一个string类型之后,用printf(“%s”,str);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。
用cout输出是没有问题的,若一定要printf输出。那么可以这样:

printf("%s",str.c_str());

11.4 char[ ] 转换成string

这个与char*的情况相同,也可以直接赋值,但是也会出现上面的问题,需要同样的处理。
字符数组转化成string类型:

char ch [] = "ABCDEFG";
string str(ch); //也可string str = ch;

或者

char ch [] = "ABCDEFG";
string str;
str = ch; //在原有基础上添加可以用str += ch;

11.5 string转换成char[ ]

string对象转换成C风格的字符串:

const char *str = s.c_str();

这是因为为了防止字符数组被程序直接处理c_str()返回了一个指向常量数组的指针。
由于我们知道string的长度可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了,这样的转换不可以直接赋值。

string str = "Hello World";
int len=str.length();
char ch[255]={};
for( int i=0;i<str.length();i++)
ch[i] = str[i];
ch[len+1] = '\0';
printf("%s\n", ch);
cout<<ch<<endl;

12. append、push_back和+=运算符的区别

+= 运算符:允许追加字符串和单个字符。
append 函数:允许追加字符串,不允许追加单个字符。
push_back 函数:只能追加单个字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值