<string> 是 C++ 标准库中提供的一个头文件,定义了 std::string 类,旨在处理和操作字符串数据。与传统的 C 风格字符串(即字符数组)相比,std::string 提供了更强大、灵活和安全的字符串处理功能。它使得字符串的操作更加高效且易于使用,避免了内存管理和边界检查等问题。

目录

  1. <string> 头文件简介
  2. std::string 类模板
  3. std::string 的常见操作
  4. 字符串查找与提取
  5. std::string 的内存管理
  6. C++11 新增的字符串操作
  7. 性能优化与注意事项
  8. 结论

1. <string> 头文件简介

在 C++ 中,<string> 头文件提供了一个名为 std::string 的类,该类用于表示和操作文本数据。与传统的 C 风格字符串(由字符数组表示)相比,std::string 类更易于使用,因为它管理内存,并自动扩展以适应所存储的字符串。

要使用 std::string 类,首先需要包含 <string> 头文件:

#include <string>


2. std::string 类模板

2.1 创建和初始化 std::string

可以通过多种方式创建和初始化 std::string 对象:

  • 默认构造函数:创建一个空字符串。
  • 初始化列表:通过字符数组或字面量初始化。
  • 指定字符的重复:通过指定字符和重复次数初始化。

示例:

#include <iostream>
#include <string>

int main() {
    // 默认构造,空字符串
    std::string str1;

    // 从字符串字面量创建
    std::string str2 = "Hello, World!";
    
    // 从字符数组创建
    const char* hello = "Hello!";
    std::string str3(hello);

    // 使用指定字符初始化
    std::string str4(5, 'A');  // "AAAAA"

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

    return 0;
}

输出:

Hello, World!
AAAAA


3. std::string 的常见操作

3.1 字符串赋值和访问

std::string 提供了多种方式来赋值和访问字符串内容。

  • 赋值:可以通过赋值运算符或 std::string::assign() 函数赋值。
  • 访问字符:可以使用下标运算符 []at() 来访问单个字符。

示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    
    // 通过下标访问
    std::cout << "Character at index 1: " << str[1] << std::endl;  // e
    
    // 使用 at() 访问
    std::cout << "Character at index 2: " << str.at(2) << std::endl; // l
    
    // 赋值
    str = "World!";
    std::cout << "New string: " << str << std::endl;  // World!

    return 0;
}

3.2 字符串连接和拼接

std::string 支持通过 + 运算符进行字符串拼接,也可以使用 append() 方法来连接字符串。

示例:

#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello";
    std::string str2 = " World!";
    
    // 使用 + 运算符拼接
    std::string result = str1 + str2;
    std::cout << "Concatenated string: " << result << std::endl;  // Hello World!

    // 使用 append() 拼接
    str1.append(str2);
    std::cout << "Appended string: " << str1 << std::endl;  // Hello World!

    return 0;
}

3.3 字符串比较

std::string 提供了几种比较字符串的方式,包括 ==!=<<=>>= 运算符。它们可以直接进行字符串的字典序比较。

示例:

#include <iostream>
#include <string>

int main() {
    std::string str1 = "apple";
    std::string str2 = "banana";

    // 字符串比较
    if (str1 < str2) {
        std::cout << str1 << " is less than " << str2 << std::endl;
    }

    return 0;
}


4. 字符串查找与提取

std::string 提供了强大的查找和提取功能。

  • find():查找子字符串的首次出现位置。
  • substr():提取子字符串。
  • rfind():从右边查找子字符串的首次出现位置。

示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 查找子字符串
    size_t pos = str.find("World");
    if (pos != std::string::npos) {
        std::cout << "'World' found at position: " << pos << std::endl;
    }

    // 提取子字符串
    std::string substr = str.substr(7, 5);  // 从索引 7 开始,长度为 5
    std::cout << "Extracted substring: " << substr << std::endl;  // World

    return 0;
}


5. std::string 的内存管理

std::string 自动管理内存。当字符串内容增加或减少时,std::string 会自动分配和释放内存。你无需手动管理内存,这使得 std::string 在处理变长字符串时非常方便和安全。

  • 容量管理:可以通过 size() 获取字符串的长度,capacity() 获取分配的内存大小,resize() 来调整字符串的大小。
  • 内存优化shrink_to_fit() 可以减少字符串所占用的内存(仅适用于 C++11 及以上)。

示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    std::cout << "Size: " << str.size() << std::endl;      // 13
    std::cout << "Capacity: " << str.capacity() << std::endl;  // 15 or more depending on implementation

    // 调整大小
    str.resize(5);
    std::cout << "Resized string: " << str << std::endl;   // Hello

    return 0;
}


6. C++11 新增的字符串操作

C++11 引入了一些新的字符串操作:

  • std::to_string():将数值类型转换为字符串。
  • std::stoi():将字符串转换为整数。
  • std::stof():将字符串转换为浮点数。

示例:

#include <iostream>
#include <string>

int main() {
    int num = 123;
    std::string str = std::to_string(num);
    std::cout << "String from integer: " << str << std::endl;  // 123
    
    str = "456";
    int converted = std::stoi(str);
    std::cout << "Converted string to integer: " << converted << std::endl;  // 456

    return 0;
}


7. 性能优化与注意事项

  • 避免不必要的拷贝:尽量使用引用或移动语义(例如通过 std::move())来避免不必要的字符串拷贝。
  • 预分配内存:通过 reserve() 可以预先分配足够的内存空间,避免在拼接或扩展字符串时进行重复的内存分配。

8. 结论

std::string 是 C++ 中处理字符串的强大工具。它简化了字符串的创建、操作、比较和内存管理,相较于传统的 C 风格字符串,提供了更多的灵活性和安全性。掌握 std::string 的基本操作,将帮助你更高效地处理字符串数据。

推荐阅读: