【C++STL容器篇之string】

309 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

string 容器

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

string 与 char 的区别 :

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

特点

  • string类内部封装了很多成员方法

      如:查找find,拷贝copy,删除delete,替换replace,插入insert
    
  • string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部负责

string 构造函数

【函数原型】:

string() : 创建一个空的字符串

string(const char*s); 使用字符串s进行初始化

复习:

            常量指针:const int *p : 指向可变,指针指向的内容不可变

            指针常量:int *const p : 执向不变,指针指向的内容可以变

string(const string &str) ; 使用一个string对象初始化另一个string对象

string(int n, char c) ; 使用n个字符c初始化

【demo】:

#include <iostream>
#include <string>

using namespace std;

// string 构造函数
void test01()
{
    // 创建空字符串,调用无参构造函数
    string str1;
    cout << "调用无参构造函数 : "
         << "str1 = " << str1 << endl; // 输出为空

    // 把 char* 转为 string
    const char *str = "hello c++";
    string str2(str);
    cout << "把 char* 转为 string : "
         << "str2 = " << str2 << endl;

    // 调用拷贝构造函数
    string str3(str2);
    cout << "调用拷贝构造函数 : "
         << "str3 = " << str3 << endl;

    // 使用n个字符c初始化
    string str4(5, 'a');
    cout << "使用n个字符c初始化 : "
         << "str4 = " << str4 << endl;
}

int main()
{

    test01();
    return 0;
}

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赋值给当前的字符串

【demo】:

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

void test01()
{
    string str1;
    str1 = "hellow c++";
    cout << "str1 = " << str1 << endl;

    string str2;
    str2 = str1;
    cout << "str2 = " << str2 << endl;

    string str3;
    str3 = 'a';
    cout << "str3 = " << str3 << endl;

    string str4;
    str4.assign("str.assign(hellow c++)");
    cout << "str4 = " << str4 << endl;

    string str5;
    str5.assign("hellow c++", 5);
    cout << "str5 = " << str5 << endl;

    string str6;
    str6.assign(str5);
    cout << "str6 = " << str6 << endl;

    string str7;
    str7.assign(5, 'x');
    cout << "str7 = " << str7 << endl;
}

int main()
{

    test01();
    return 0;
}

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个字符串连接到当前字符串的结尾

【demo】:

#include <iostream>
#include <string>

using namespace std;

void test01() {
	string str1 = "hello";
	str1+=" c++";
	cout<<"str1 = "<<str1<<endl;

	str1+=":";
	cout<<"str1 = "<<str1<<endl;

	string str2 = " this is test demo ";
	str1+=str2;
	cout<<"str1 = "<<endl;

	string str3 = "A";
	str3.append("B");
	str3.append("C");

	// 从下标2位置开始,截取3个字符,拼接到字符串的末尾
	str3.append(str2,2,4);
	cout<<"str3 = "<<str3<<endl;

}


int main()
{
    test01();
    return 0;
}

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最后一次出现的位置

string &replace(int pos , int n , const string &str) ; 使用字符串str替换从pos开始的n个字符

string &replace(int pos , int n , const char *s) ; 使用字符串s替换从pos开始的n个字符

 【demo】:

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

// 查找
void test01()
{
    string str1 = "abcdefghijklfg";
    string subStr = "fg";
    int pos = str1.find(subStr);

    if (pos == -1)
    {
        cout << "未找到" << subStr << endl;
    }
    else
    {
        cout << subStr << "第一次出现的位置为:pos = " << pos << endl;
    }

    pos = str1.rfind("fg");

    if (pos == -1)
    {
        cout << "未找到" << subStr << endl;
    }
    else
    {
        cout << subStr << "最后一次出现的位置为:pos = " << pos << endl;
    }
}

// 替换
void test02()
{
    string str1 = "hellow world";
    string replaceStr = "c++";

    str1.replace(7, 5, replaceStr);
    cout << str1 << "替换后为:" << str1 << endl;
}

int main()
{
    test01();
    test02();
    return 0;
}

【小结】

  • find 查找是从左往右,rfind是从右往左
  • find 查找到字符串后返回查找的第一个字符位置,找不到返回-1
  • replace 在替换时,要指定从哪个位置开始,多少个字符,替换成什么样的字符串

string字符串比较

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

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

【函数原型】:

int compare(const string &s) const ; 与字符串 s 进行比较

int compare(const char *s) const ; 与字符串 s 进行比较

【demo】:

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

void test01()
{
    /*
        字符串的比较返回值有 1,0,-1
        == : 返回 0 
        >  : 返回 1
        <  : 返回 -1
    
    */
    string str1 = "hellow";
    string str2 = "ellow";

    int ret = str1.compare(str2);

    if (ret == 0)
    {

        cout << "str1 == str2" << endl;
    }
    else if (ret > 0)
    {
        cout << "str1 > str2" << endl;
    }
    else
    {
        cout << "str1 < str2" << endl;
    }
}

int main()
{

    test01();
    return 0;
}

    

【小结】:字符串对的比较主要是判断两个字符串是否想等,判断大小,意义不大

string字符获取

【函数原型】:

char &operator[](int n) ; 通过 [] 方式获取字符

char &at(int n) ; 通过 at 方式获取字符

 【demo】:

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

void test01()
{
    string str = "hello c++";
    // 使用 [] 获取字符
    cout << "使用 [] 获取字符:";
    for (int i = 0; i < str.size(); i++)
    {
        cout << str[i] << " ";
    }
    cout << endl;

    // 使用 at 获取字符
    cout << "使用 at 获取字符:";
    for (int i = 0; i < str.size(); i++)
    {
        cout << str.at(i) << " ";
    }
    cout << endl;
}
int main()
{

    test01();
    return 0;
}

【注】:获取字符串的大小:str.size()

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个字符

【demo】:

#include <iostream>
#include <string>

using namespace std;

// string插入与删除操作 , 下标都是从0开始的
void test01()
{
    string str1 = "hellow c++";
    // 从第6个位置开始,插入" 0000"
    str1.insert(6, " 0000");
    cout << str1 << endl;

    // 从第6个位置开始,删除连续的4个字符
    str1.erase(6, 4);
    cout << str1 << endl;
}

int main()
{
    test01();
    return 0;
}

    

string子串

【函数原型】:

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

【demo】:

#include <iostream>
#include <string>

using namespace std;

void test01()
{
    string str1 = "hellow c++";

    string subStr1 = str1.substr(0, 6);
    cout << subStr1 << endl;
}
int main()
{
    test01();
    return 0;
}