C++风格字符串,std:string 类

代码包含内容有:

  • 字符串拼接
  • 字符串比较
  • compare() 成员函数
  • 三向比较运算符 <=>
  • 访问字符串中的字符
  • 转换为C风格字符串
  • 字符串操作,包括:
  • substr(pos, len)
  • find(str)
  • replace(pos, len, str)
  • starts_with(str), ends_with(str)
  • contains(str), containns(ch)

代码如下:

#include <iostream>
#include <string>
#include <cstring>
#include <compare>

int main() {
    {
        // 拼接字符串
        std::string a{"12"};
        std::string b{"34"};

        // 重载的 + 运算符
        std::string c {a+b};  // 1234
        std::cout << c << std::endl;

        // 重载的 += 运算符
        a += b;  // 1234
        std::cout << a << std::endl;
    }

    {
        // 比较两个字符串
        std::string a {"Hello"};
        std::string b {"hello"};

        // 用重载的 ==, !=, >, <, >=, <= 比较
        const char* sign {a == b ? "==" : a > b ? ">" : "<"};
        std::cout << a << sign << b << std::endl;

        // compare() 成员函数
        // 行为类似于 strcmp(),返回值为 小于0的值; 0; 大于0的值
        int result {a.compare(b)};
        const char* sign2 {result == 0 ? "==" : result > 0 ? ">" : "<"};
        std::cout << a << sign << b << std::endl;

        // 三向比较运算符 <=>
        auto result2 {a<=>b};
        if (std::is_gt(result2)) {
            const char* sign3 {">"};
        }
        else if (std::is_lt(result2)) {
            const char* sign3 {"<"};

        }
        else if (std::is_eq(result2)) {
            const char* sign3 {"=="};
        }
        std::cout << a << sign << b << std::endl;
    }

    {
        // 访问字符串中各个字符,
        // 使用 方括号运算符 []
        // 像C风格字符串那样
        std::string a {"hello, world!"};
        std::cout << a << std::endl;
        a[0] = 'H';
        a[7] = 'W';
        std::cout << a << std::endl;
    }

    {
        // 转换为C风格字符串
        // 成员函数 c_str()
        // 成员函数 data()

        std::string a {"hello, world!"};
        const char* str1 {a.c_str()};
        char* str2 {a.data()};  // 在 C++14 及之前,data()返回 const char*
    }

    {
        // 字符串操作
        std::string a {"hello, world!"};

        // substr(pos, len)
        // 返回从给定位置开始且具有给定长度的子字符串
        std::string str1 {a.substr(0, 5)};
        std::cout << str1 << std::endl;

        // find(str)
        // 返回找到给定子字符串的位置,未找到则返回`string::npos`
        std::size_t pos1 {a.find("world")};
        if (pos1 != std::string::npos) {
            std::cout << "找到啦:" << pos1 << std::endl;
        }

        // replace(pos, len, str)
        // 用另一个字符串替换字符串的一部分(由位置和长度指定)
        std::string b {"hello, world!"};
        b.replace(7, 5, "Aoyu");
        std::cout << b << std::endl;

        // starts_with(str)
        // ends_with(str)
        // 如果字符串以给定的子字符串开头/结尾,则返回`true`
        if (a.starts_with("hello")) {
            std::cout << a << " 以 hello 开头" << std::endl;
        }
        if (a.ends_with("!")) {
            std::cout << a << " 以 ! 结尾" << std::endl;
        }

        // contains(str), containns(ch)
        // 如果`string`包含另一个`string`或字符,则返回`true`
        // C++23
        if (a.contains("wor")) {
            std::cout << a << " 包含 wor" << std::endl;
        }
        if (a.contains('h')) {
            std::cout << a << " 包含 h" << std::endl;
        }
    }

    return 0;
}

std::string 字符串字面量

按照C++标准规定,字符串字面量的类型为“n个const char的数组”。因此,字符串字面量通常被解释为const char*const char[]。可以使用标准字面量s将字符串字面量解释为 std::string

#include <iostream>
#include <string>

int main() {
    {
        // std::string 字符串字面量
        // 标准字面量

        auto str1 {"hello world"};  // str1 类型是 const char*
        auto& str2 {"hello world"};  // str2 类型是 const char[12]

        using namespace std::literals::string_literals;  // 内联命名空间
        auto str3 {"hello world"s};  // str3 类型是 std::string
    }

    return 0;
}

字符串向量的 CTAD

CTAD,类模板参数推断,用于自动推断模板类型参数,在使用类模板时不需要再手动在尖括号内指定类型参数。创建字符串向量时,需要注意,如代码:

#include <iostream>
#include <string>
#include <vector>

int main() {
    {
        // 字符串向量的 CTAD
        
        std::vector names1 {"XiaoMing", "XiaoHong", "XiaoLiang"};
        // 推断出的 names1 的类型为 std::vector<const char*>

        // 使用 std::string 字符串字面量
        using namespace std::literals;
        std::vector names2 {"XiaoMing"s, "XiaoHong"s, "XiaoLiang"s};
        // 推断出的 names2 的类型为 std::vector<std::string>
    }

    return 0;
}

C++风格字符串,std:string 类》有2个想法

  1. Pingback引用通告: 字符串字面量 | 煲仔饭

  2. Pingback引用通告: 命名空间 | 煲仔饭

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注