【C++】标准库中的string类

发布时间:2023年12月19日

目录

一、介绍

二、常用接口

1.构造函数和赋值操作

2.string类对象的容量操作

3.string类对象的访问及遍历操作

4.string类对象的修改操作

5.string类非成员函数

放在最后


一、介绍

在C++中,std::string 是标准库提供的字符串类。它属于 <string> 头文件,并为处理字符串提供了一套丰富的功能和方法。std::string 是一个动态数组类,它能够自动调整大小,提供了许多便利的成员函数用于字符串的操作和处理。下面是string类的常用操作:

  1. 动态大小: std::string 类能够自动调整大小,不需要手动管理内存,这使得字符串的使用更为方便。

  2. 成员函数: std::string 提供了丰富的成员函数,包括字符串的连接、截取、查找、替换、比较等操作。

  3. 访问字符: 通过索引、迭代器等方式可以访问和修改字符串中的字符。

  4. 输入输出: 可以使用流操作符 <<>> 进行字符串的输入和输出。

  5. 构造函数: std::string 支持多种构造函数,包括默认构造函数、接受 C 风格字符串的构造函数、拷贝构造函数等。

  6. 常用算法: 提供了一些常用的算法,比如字符串查找、替换等。

  7. 内存管理: std::string 负责管理字符串的内存,避免了手动内存管理的麻烦。

二、常用接口

1.构造函数和赋值操作

  • 默认构造函数: std::string()
  • 带字符串参数的构造函数: std::string(const char* s)
  • 拷贝构造函数: std::string(const std::string& str)
  • 赋值操作符: operator=, assign

代码实例:

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


int main() {
    // 默认构造函数
    std::string str1;

    // 带字符串参数的构造函数
    std::string str2 = "Hello, World!";

    // 拷贝构造函数
    std::string str3 = str2;

    // 赋值操作
    std::string str4;
    str4 = "World, Hello!";

    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    std::cout << str3 << std::endl;
    std::cout << str4 << std::endl;

    return 0;
}

输出:

2.string类对象的容量操作

  • length 方法: 返回字符串的长度
  • size 方法: 返回字符串的大小(长度)
  • capacity 方法:返回空间总大小
  • empty 方法:检测字符串释放为空串,是返回true,否则返回false
  • clear 方法:清空有效字符
  • reverse 方法:为字符串预留空间
  • resive 方法:将有效字符的个数该成n个,多出的空间用字符c填充

代码实例:

#include <iostream>
#include <string>

int main() {
    std::string myString = "Hello, World!";

    // length 方法:返回字符串的长度
    std::cout << "Length: " << myString.length() << std::endl;

    // size 方法:返回字符串的大小(长度)
    std::cout << "Size: " << myString.size() << std::endl;

    // capacity 方法:返回空间总大小
    std::cout << "Capacity: " << myString.capacity() << std::endl;

    // empty 方法:检测字符串是否为空串
    std::cout << "Is empty? " << (myString.empty() ? "Yes" : "No") << std::endl;

    // clear 方法:清空有效字符
    myString.clear();
    std::cout << "After clear: " << myString << std::endl;

    // reverse 方法:为字符串预留空间
    myString.reserve(20);
    std::cout << "After reserving space: " << myString << std::endl;

    // resize 方法:将有效字符的个数修改为 n 个,多出的空间用字符 'X' 填充
    myString.resize(10, 'X');
    std::cout << "After resizing: " << myString << std::endl;

    return 0;
}

输出:

?

3.string类对象的访问及遍历操作

  • operator[] 返回pos位置的字符,const string类对象调用
  • begin + end: begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
  • rbegin + rend:rbegin获取最后一个字符的迭代器 + end获取第一个字符前一个位置的迭代器
  • 范围 for:C++11支持更简洁的范围for的新遍历方式

代码实例:

#include <iostream>
#include <string>

int main() {
    const std::string myString = "Hello, World!";

    // operator[]:返回 pos 位置的字符,const string 类对象调用
    char character = myString[7];
    std::cout << "Character at position 7: " << character << std::endl;

    // begin + end:begin 获取第一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器
    std::cout << "Using begin() and end() to iterate:" << std::endl;
    for (auto it = myString.begin(); it != myString.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // rbegin + rend:rbegin 获取最后一个字符的迭代器 + end 获取第一个字符前一个位置的迭代器
    std::cout << "Using rbegin() and rend() to iterate in reverse:" << std::endl;
    for (auto it = myString.rbegin(); it != myString.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 范围 for 循环:C++11 支持更简洁的范围 for 的新遍历方式
    std::cout << "Using range-based for loop:" << std::endl;
    for (char c : myString) {
        std::cout << c << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

?

4.string类对象的修改操作

  • push back:在字符串后尾插字符c
  • append:在字符串后追加一个字符串
  • operator +=:在字符串后追加字符串str
  • c_str:返回C格式字符串
  • find + npos:从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
  • rfind:从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
  • substr:在str中从pos位置开始,截取n个字符,然后将其返回

???????代码实例:

#include <iostream>
#include <string>

int main() {
    std::string myString = "Hello, ";

    // push_back:在字符串后尾插字符 'C'
    myString.push_back('C');
    std::cout << "After push_back: " << myString << std::endl;

    // append:在字符串后追加一个字符串
    myString.append("World!");
    std::cout << "After append: " << myString << std::endl;

    // operator +=:在字符串后追加字符串 " Welcome!"
    myString += " Welcome!";
    std::cout << "After operator +=: " << myString << std::endl;

    // c_str:返回 C 格式字符串
    const char* cStr = myString.c_str();
    std::cout << "C-style string: " << cStr << std::endl;

    // find + npos:从字符串位置 7 开始往后找字符 'o',返回该字符在字符串中的位置
    size_t pos = myString.find('o', 7);
    if (pos != std::string::npos) {
        std::cout << "Found 'o' at position: " << pos << std::endl;
    } else {
        std::cout << "'o' not found." << std::endl;
    }

    // rfind:从字符串位置 7 开始往前找字符 'o',返回该字符在字符串中的位置
    size_t rpos = myString.rfind('o', 7);
    if (rpos != std::string::npos) {
        std::cout << "Found last 'o' at position: " << rpos << std::endl;
    } else {
        std::cout << "Last 'o' not found." << std::endl;
    }

    // substr:在字符串中从位置 7 开始截取 5 个字符,然后将其返回
    std::string substr = myString.substr(7, 5);
    std::cout << "Substring: " << substr << std::endl;

    return 0;
}

?输出:

5.string类非成员函数

  • operator+传值返回,导致深拷贝效率低(少用)
  • operator>>:输入运算符重载
  • operator<<:输出运算符重载
  • getline:获取一行字符串
  • relational operators:大小比较

代码实例:

#include <iostream>
#include <string>

int main() {
    // operator+:传值返回,导致深拷贝效率低(少用)
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    std::string result = str1 + str2;  // 使用 operator+ 进行字符串连接

    std::cout << "Concatenated string: " << result << std::endl;

    // operator>>:输入运算符重载
    std::string inputString;
    std::cout << "Enter a string: ";
    std::cin >> inputString;
    std::cout << "You entered: " << inputString << std::endl;

    // operator<<:输出运算符重载
    std::string outputString = "Output this string!";
    std::cout << "Output using operator<<: " << outputString << std::endl;

    // getline:获取一行字符串
    std::string line;
    std::cout << "Enter a line of text: ";
    std::getline(std::cin, line);
    std::cout << "You entered: " << line << std::endl;

    // relational operators:大小比较
    std::string str3 = "apple";
    std::string str4 = "banana";

    if (str3 == str4) {
        std::cout << "Strings are equal." << std::endl;
    } else if (str3 < str4) {
        std::cout << "str3 is less than str4." << std::endl;
    } else {
        std::cout << "str3 is greater than str4." << std::endl;
    }

    return 0;
}

输出:

?

放在最后

以上只是对string类的初步认识,想要继续深入了解它还需要经过大量的练习以及string类的自我实现,理解了它的底层原理才能更好地运用它,后续我也会继续推出有关string类的自我实现的博客,请期待一波~~

文章来源:https://blog.csdn.net/dhgiuyawhiudwqha/article/details/135072583
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。