string容器

string容器

1 string基本概念

本质

  • string是c++风格的字符串,而string本质上是一个类

*string 和 char 的区别:

  • char * 是一个指针
  • string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型的容器

特点

  • string类内部封装了很多成员方法,例如查找find,拷贝copy,删除delete,插入insert
  • string管理char * 所分配的内存,不用担心复制越界和取值越界,由类内部进行负责

2 string 构造函数

构造函数原型:

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

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
void test01() {
string s1;

const char* str = "hello world";
string s2(str);
cout << s2 << endl;

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

string s4(10, 'a');
cout << s4 << endl;
}
int main() {
test01();
return 0;
}

3 string赋值函数

  • 赋值的函数原型:

    (1)stirng& 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 赋给当前字符串

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void test02() {
//stirng& operator=(const char* s); //char *类型字符串赋值给当前的字符串
string str1 = "hello world";

//string& operator=(const string & s); //把字符串 s 赋给当前的字符串
string str2 = str1;

//string& operator=(char c); //字符赋给当前的字符串
string str3;
str3 = 'a';

//string& assign(const char* s); //把字符串 s 赋给当前的字符串
string str4;
str4.assign("hello");

//string& assign(const char* s, int n);//把字符串 s 的前n个字符赋给当前的字符串
string str5;
str5.assign("hello c++", 5);

//string& assign(const string & s); //把字符串 s 赋给当前的字符串
string str6;
str6.assign(str5);

//string& assign(int n,char c); //用n个字符 c 赋给当前字符串
string str7;
str7.assign(5, 'x');
}

4 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 string &s,int pos,int n); //字符串s中从pos开始的n个字符连接到字符串结尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void test03() {
//string& operator +=(const char* str); 重载+=操作符
string str1 = "我";
str1 += "很好";

//string& operator +=(const char c); 重载+=操作符
str1 += ':';

//string& operator +=(const string & str); 重载+=操作符
string str2 = "加油\n";
str1 += str2;

//string& append(const char* s); 把字符串s连接到当前字符串结尾
string str3 = "I ";
str3.append("Love ");

//string& append(const char* s,int n); 把字符串 s 的前n个字符连接到当前字符串结尾
str3.append("Gameabcd",4);
//string& append(const string & s); 同 operator +=(const string& str)
str3.append(str2);
//string& append(const string & s, int pos, int n); 字符串s中从pos开始的n个字符连接到字符串结尾
}

5 string查找和替换

  • 功能描述

    (1)查找:查找指定字字符串是否存在

    (2)替换:在指定的位置替换字符串

  • 函数原型

    (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); //替换从pos开始n个字符为字符串str

    (10) string& replace(int pos, int n, const char* s); //替换从pos开始n个字符为字符串s

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
void test04() {
string str1 = "abcdefghde";
int pos = str1.find("de");//找到返回位置,是从0开始算,未找到返回-1
cout << pos << endl;
pos = str1.find("k");//找到返回位置,是从0开始算,未找到返回-1
cout << pos << endl;
pos = str1.rfind("de");//从右往左查找
cout << pos << endl;
//替换
string str2 = "asdfgh";
str2.replace(1, 3, "1111");//从1号位置起三个字符替换为 1111
cout << "str = " << str2 << endl;
}

6 string字符串比较

  • 功能函数

    字符串之间的比较

  • 比较方式

    字符串比较按照字符的ASCII码进行对比

    = 返回 0 > 返回 1 < 返回 -1

  • 函数原型

    (1)int compare(const string &s ) const;

    (2)int compare(const char *s ) const;

示例:

1
2
3
4
5
6
7
8
9
void test05() {
string str1 = "hello";
string str2 = "hello";
string str3 = "world";
if (str1.compare(str2) == 0)
cout << "str1 = str2" << endl;
if (str1.compare(str3) == -1)
cout << "str1 < str2" << endl;
}

7 string字符存取

  • string单个字符存取方式

    (1)char& operator[] (int n)

    (2)char& at(int n)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void test06() {
    string str = "HELLO";
    //读
    for (int i = 0; i < str.size(); i++) {
    cout << str[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < str.size(); i++) {
    cout << str.at(i) << " ";
    }
    cout << endl;
    str[0] = 'Q';
    str.at(2) = 'W';
    cout << str << endl;
    }

8 string插入和删除

  • 功能描述

    对string字符串进行插入和删除字符操作

  • 函数原型

    (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)

    (4)string& erase(int pos,int n = npos) //删除从Pos开始的n个字符

1
2
3
4
5
6
7
void test07() {
string str = "HELLO";
str.insert(str.size(), "World");
cout << str << endl;
str.erase(1, 5);
cout << str << endl;
}

9 string子串

  • 功能描述

    从字符串获取想要的子串

  • 函数原型

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

1
2
3
4
5
6
void test08() {
string email = "zhangsan@sina.com";
int pos = email.find('@');
string userName = email.substr(0, pos);
cout << "userName = " << userName << endl;
}