C++ STL 系列(一):string 容器详解与示例

文章目录

仓库链接
本仓库提供STL相关每一篇文章的完整可运行示例代码。

bash 复制代码
git clone https://github.com/MaikieMaiky/cpp_STL.git

string基本概念

本质:

  • string是C++风格的字符串,本质是类

string和char*区别:

  • char*是一个指针
  • string是一个类,内部封装了char*,是一个char*型的容器

特点:

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

  • 例如:find copy delete replace insert

  • string自动管理char*的内存分配,并且无需担心复制越界和取值越界,由类内部负责


string构造函数

原型:

  • string() - 创建空字符串

  • string(const char* s) - 使用c风格字符串初始化

  • string(const string &str) - 使用一个string对象初始化另一个string对象,左值右值皆可

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

  • 示例

    cpp 复制代码
    // string的构造函数
    /**
     * string(); // 创建一个空的字符串 例如: string str;
     * 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;
    
    void test0()
    {
        // 1. 默认构造
        string s1; 
    
        // 2. 使用字符串s初始化
        const char* str = "hello world";
        string s2(str); // 使用字符串s初始化
    
        // 3. 使用一个string对象初始化另一个string对象
        string s3(s2);
    
        // 4. 使用n个字符c初始化
        string s4(10, 'a');
    
        cout << "s2 = " << s2 << endl;
        cout << "s3 = " << s3 << endl;
        cout << "s4 = " << s4 << endl;
    }
    
    int main()
    {
        test0();
        return 0;
    }

构造函数按需灵活使用即可


string赋值操作

原型 =重载/成员函数

  • string& operator=(const char* s); // 使用字符串s赋值

  • string& operator=(const string& s); // 使用一个string对象赋值

  • string& operator=(char c); // 使用字符c赋值

  • assign(const char* s); // 使用字符串s赋值

  • assign(const char* s, int n); // 使用字符串s的前n个字符赋值

  • assign(const string& s); // 使用一个string对象赋值

  • assign(int n, char c); // 使用n个字符c赋值

  • 示例

    cpp 复制代码
    // string的赋值函数
    /**
     * string& operator=(const char* s);    // 使用字符串s赋值
     * string& operator=(const string& s);  // 使用一个string对象赋值
     * string& operator=(char c);           // 使用字符c赋值
     * assign(const char* s);               // 使用字符串s赋值
     * assign(const char* s, int n);        // 使用字符串s的前n个字符赋值
     * assign(const string& s);             // 使用一个string对象赋值
     * assign(int n, char c);               // 使用n个字符c赋值
     *
     */
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void test0()
    {
        string s1;
        s1 = "hello world";
    
        string s2;
        s2 = s1;
    
        string s3;
        s3 = 'a';
    
        string s4;
        s4.assign("hello world");
    
        string s5;
        s5.assign("hello world", 5);
        
        string s6;
        s6.assign(s1);
    
        string s7;
        s7.assign(10, 'a');
    
        cout << "s1 = " << s1 << endl;
        cout << "s2 = " << s2 << endl;
        cout << "s3 = " << s3 << endl;
        cout << "s4 = " << s4 << endl;
        cout << "s5 = " << s5 << endl;
        cout << "s6 = " << s6 << endl;
        cout << "s7 = " << s7 << endl;
    }
    
    int main()
    {
        test0();
        return 0;
    }

string赋值方式很多,operator= 比较实用


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); // 把字符串s连接到当前字符串结尾

  • string& append(const string& s, int pos, int n);// 把字符串s从pos开始的n个字符连接到当前字符串结尾

  • string& append(int n, char c); // 在当前字符串结尾添加n个字符c

  • 示例

    cpp 复制代码
    // 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);                 // 把字符串s连接到当前字符串结尾
     * string& append(const string& s, int pos, int n); // 把字符串s从pos开始的n个字符连接到当前字符串结尾
     * string& append(int n, char c);                   // 在当前字符串结尾添加n个字符c
     * 
     */
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void test0()
    {
        string s1 = "hello";
        s1 += " world";
    
        string s2 = "hello";
        s2 += 'b';
    
        string s3 = "hello";
        s3 += s1;
        
        string s4 = "hello";
        s4.append(" world");
        
        string s5 = "hello";
        s5.append(" world", 3);
    
        string s6 = "hello";
        s6.append(s1);
    
        string s7 = "hello";
        s7.append(s1, 5, 6);
    
        string s8 = "hello";
        s8.append(5, 'b');
    
        cout << "s1 = " << s1 << endl;
        cout << "s2 = " << s2 << endl;
        cout << "s3 = " << s3 << endl;
        cout << "s4 = " << s4 << endl;
        cout << "s5 = " << s5 << endl;
        cout << "s6 = " << s6 << endl;
        cout << "s7 = " << s7 << endl;
        cout << "s8 = " << s8 << endl;
    }
    
    int main()
    {
        test0();
        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; // 查找s前n个字符第一次出现位置,从pos开始查找

  • int find(const char c, int pos = 0) const; // 查找c第一次出现位置,从pos开始查找

  • 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; // 查找s前n个字符最后一次出现位置,从pos开始查找

  • int rfind(const char c, int pos = npos) const; // 查找c最后一次出现位置,从pos开始查找

  • string& replace(int pos, int n, const string& str); // 替换从pos开始的n个字符为str

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

  • 示例

    cpp 复制代码
    // 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;       // 查找s前n个字符第一次出现位置,从pos开始查找
     * int find(const char c, int pos = 0) const;           // 查找c第一次出现位置,从pos开始查找
     * 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;      // 查找s前n个字符最后一次出现位置,从pos开始查找
     * int rfind(const char c, int pos = npos) const;       // 查找c最后一次出现位置,从pos开始查找
     * 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;
    
    // 1. find
    void test0()
    {
        string str = "abcdefgde";
        int pos = str.find("de");
    
        cout << "pos = " << pos << endl;
    
        pos = str.rfind("de");
        cout << "pos = " << pos << endl;
    
    }
    
    // 2. replace
    void test1()
    {
        string str = "abcdefgde";
        // 把1-3位置的字符替换为1111这个字符串
        str.replace(1, 3, "1111");
        cout << "str = " << str << endl;
    
        
    }
    
    int main()
    {
        test1();
        return 0;
    }

find与rfind区别:

  • find从左往右找
  • rfind从右往左找

find not found return std::string::npos which is often -1


string比较

比较方式:

  • 按照字符的ASCII码逐个对比
  • = 返回0
  • 返回1

  • < 返回 -1

原型:

  • int compare(const string& s) const // 与字符串s比较

  • int compare(const char* s) const // 与字符串s比较

  • 示例(仅包含必要部分)

    cpp 复制代码
    void test0()
    {
        string s1 = "xello";
        string s2 = "hello";
        if (s1.compare(s2) == 0)
        {
            cout << "s1 == s2" << endl;
        }
        else if (s1.compare(s2) > 0)
        {
            cout << "s1 > s2" << endl;
        }
        else
        {
            cout << "s1 < s2" << endl;
        }
    }

字符串一般用于判断相等,谁大谁小没有意义


string字符存取

两种方式:[ ] / at

原型:

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

  • char& at(int n); // 通过at方法获取字符

  • 示例(仅包含必要部分)

    cpp 复制代码
    void test0()
    {
        // 1. []
        string str = "hello";
        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;
    
        // 3. 修改
        str[0] = 'b';
        str.at(1) = 'b';
        cout << "str = " << str << endl;
    }

string 插入和删除

插入和删除字符串

原型:

  • string& insert(int pos, const char* s); // 在pos位置插入字符串s

  • string& insert(int pos, const string& str); // 在pos位置插入字符串str

  • string& insert(int pos, int n, char c); // 在pos位置插入n个字符c

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

  • 示例(仅包含必要部分)

    cpp 复制代码
    void test0()
    {
        string str = "hello";
    
        // 1. 插入
        str.insert(1, "111");
        cout << "str = " << str << endl;
        
        // 2. 删除
        str.erase(1, 3);
        cout << "str = " << str << endl;
    }

插入和删除的起始下标都是从0开始的


string子串获取

从string中截取需要的子串,比如配合find截取邮箱中@之前的名字

灵活使用取字串,可以方便的分别取出string的有效信息

原型:

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

  • 示例(仅包含必要部分)

    cpp 复制代码
    void test0()
    {
        string str = "LeiJun@gmail.com";
    
        // 取出用户名
        int pos = str.find('@');
        string username = str.substr(0, pos);
        cout << "username: " << username << endl;
    }
相关推荐
之歆1 小时前
DAY_25 JavaScript 原型、原型链与值类型/引用类型 ── 深度全解(下)
开发语言·javascript·ecmascript
段ヤシ.1 小时前
回顾Java知识点,面试题汇总Day7(持续更新)
java·开发语言
努力努力再努力wz1 小时前
【Qt入门系列】深入理解信号与槽:从事件响应到自定义信号机制
c语言·开发语言·数据结构·数据库·c++·qt·mysql
在角落发呆1 小时前
DTU 数据转发服务器:工业物联网的隐形桥梁
开发语言·php
Sakuyu434681 小时前
C语言基础--基本数据类型
c语言·开发语言
在坚持一下我可没意见1 小时前
Python 修仙修炼录 05:循环神通,省去无用苦修
开发语言·python·面试·入门·循环·复习
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
techdashen1 小时前
Rust 社区在 4 月做了什么:项目管理月报解读
开发语言·rust·mfc
萧戈1 小时前
C/C++ 运行时库概念详解
c语言·c++