【C++探索之路】STL---string

走进C++的世界,也意味着我们对编程世界的认知达到另一个维度,如果你学习过C语言,那你绝对会有不一般的收获,感受到C++所带来的码云风暴~

---------------------------------------begin---------------------------------------

什么是string:

在C++编程中,字符串(String)是一种非常基本且强大的数据类型 ,用于存储和操作文本数据

。与C语言中的字符数组 相比,C++标准库中的std::string类提供了更为丰富和便捷的功能

string的概念:

  • string是计算机科学中一种基本的数据类型,用于表示由字符组成的序列。它在不同的编程语言中有不同的实现方式,但核心功能相似,包括存储、操作和处理字符串。
  • 在C++中,std::string是标准库中的一个类,用于高效地管理字符串数据。它通过动态内存 分配来存储字符,并提供了丰富的成员函数来操作字符串。

string基础:

1.1 引入头文件

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

1.2 创建和初始化

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

1.3 基本操作
  • 长度获取str.length()str.size()返回字符串的长度。
  • 拼接str += " more text";或使用str.append(" more text");
  • 访问字符str[index]str.at(index)at方法在越界时会抛出异常)。
  • 子串str.substr(pos, len)返回从pos开始长度为len的子串。

在前面我们讲解过C++的类和对象中的构造函数,析构函数在string中同样适用哦~

  • 构造函数
    • string():默认构造函数,创建一个空字符串。
    • string(const char* str):使用C风格字符串构造string对象。
    • string(const string& s):拷贝构造函数,用于复制另一个string对象。
    • string(size_t n, char c):用指定字符重复构造字符串。
  • 析构函数\~string()负责释放动态分配的内存,确保资源管理的正确性。

string的成员变量与内部实现**:**

  • string类通常包含以下成员变量:
    • _str:指向动态分配的字符数组的指针。
    • _size:存储字符串的实际长度。
    • _capacity:存储分配空间的大小。
  • 内部实现上,string底层通过边长数组的方式存储字符串,并使用指针管理内存。
访问与遍历
  • 使用[]运算符访问单个字符。
  • 使用迭代器遍历字符串内容,例如:
  • 注意:迭代器访问时需防止越界!!!
2.1 查找和替换
  • 查找:str.find("substring")返回子串第一次出现的位置,若未找到则返回std::string::npos
  • 替换:str.replace(pos, len, "new_substring")pos开始替换长度为len的部分为新的子串。
2.2 修改字符串
  • 插入:str.insert(pos, "inserted_text")pos位置插入文本。
  • 删除:str.erase(pos, len)pos开始删除长度为len的字符。
2.3 转换
  • C风格字符串转换:str.c_str()返回一个指向以null结尾的字符数组的指针,可以与需要C风 格字符串的函数兼容。
  • 数字转换:虽然std::string本身不提供直接的数字到字符串的转换,但可以使用std::to_string函数(需要包含<string><cstdlib><cmath>头文件)。

高级应用:

3.1 字符串流

std::stringstream类允许在字符串和流之间进行转换,非常适合于解析和构建复杂的字符串数据:

cpp 复制代码
#include <sstream>
std::stringstream ss;
ss << "Number: " << 123 << ", Text: Hello";
std::string result;
ss >> result; // 只读取到第一个空格前的部分,即"Number:"

为了读取整个流,可以使用循环或特定的分隔符处理。

3.2 字符串哈希

在某些应用场景下,需要对字符串进行哈希处理。虽然C++标准库没有直接提供字符串哈希函数,

但可以通过自定义哈希函数来实现:

cpp 复制代码
#include <functional> // for std::hash

std::hash<std::string> hash_fn;
size_t hash_value = hash_fn("example string");
3.3 字符串分割

标准库没有直接提供字符串分割函数,但可以通过组合使用std::string的成员函数和算法来实现:

cpp 复制代码
#include <vector>
#include <algorithm>
#include <cctype>

std::vector<std::string> split(const std::string& s, char delimiter) {
    std::vector<std::string> tokens;
    std::string token;
    for (char c : s) {
        if (c == delimiter) {
            if (!token.empty()) {
                tokens.push_back(token);
                token.clear();
            }
        } else {
            token += c;
        }
    }
    if (!token.empty()) {
        tokens.push_back(token);
    }
    return tokens;
}

string的用法还有很多,需要我们慢慢学习并且用上哦~

----------------------------------------end----------------------------------------

相关推荐
比特在路上25 分钟前
蓝桥杯之c++入门(一)【数据类型】
c++·职场和发展·蓝桥杯
菜菜小蒙1 小时前
【C++】特殊类设计、单例模式与类型转换
开发语言·c++
水瓶丫头站住2 小时前
用C++编写一个2048的小游戏
c++
Wyyyyy_m3 小时前
牛客训练营(一)补题
c++·算法
Ciderw3 小时前
TCP三次握手和四次挥手
开发语言·网络·c++·后端·网络协议·tcp/ip·golang
qing_0406033 小时前
C++——list的了解和使用
开发语言·数据结构·c++·stl·list
H CHY3 小时前
二维数组一
开发语言·数据结构·c++·算法·青少年编程·c#·动态规划
重生之我在20年代敲代码4 小时前
力扣算法题——1089.复写零【系统讲解】
c++·算法·leetcode·职场和发展
字节高级特工7 小时前
【优选算法】11----最大连续1的个数|||
c++·算法·leetcode
xianwu5438 小时前
反向代理模块。。
开发语言·网络·数据库·c++·mysql