学而时习之:C++中的字符串

C++ 中的字符串

在 C++ 中,字符串是 std::string 类的对象,用于表示和操作字符序列。

与 C 风格的字符数组(char[])不同,std::string 会自动管理内存,并提供了大量内置函数,使用起来更加方便。

它可以随着字符的添加或删除自动增长或缩小,不像固定大小的 C 风格字符串。你可以轻松地访问字符、拼接字符串、比较字符串、提取子字符串以及在字符串中查找内容,这些都通过内置函数完成。

示例代码讲解:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    
    // 创建一个字符串
    string str = "Hello Geeks";

    // 使用索引遍历字符串
    cout << "使用索引遍历: ";
    for (int i = 0; i < str.size(); i++) {
        cout << str[i];
    }
    cout << endl;

    // 使用范围 for 循环遍历字符串
    cout << "使用范围 for 循环遍历: ";
    for (char ch : str) {
        cout << ch;
    }
    cout << endl;

    // 使用迭代器遍历字符串
    cout << "使用迭代器遍历: ";
    for (auto it = str.begin(); it != str.end(); it++) {
        cout << *it;
    }
    cout << endl;

    return 0;
}
makefile 复制代码
使用索引遍历: Hello Geeks
使用范围 for 循环遍历: Hello Geeks
使用迭代器遍历: Hello Geeks

语法

字符串容器在 <string> 头文件中被定义为 std::string 类。

cpp 复制代码
string str;

其中:

  • string:由 STL 提供的类,用于处理字符序列。
  • str:为该字符串对象指定的名称。

字符串的基本操作

1.初始化字符串

初始化字符串是在创建字符串对象时就给它赋初值。

可以直接用 = 号,或者用构造函数语法,把用引号括起来的文本赋给字符串。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    
    // 直接初始化字符串
    string str = "Hello Geeks";

    // 打印字符串
    cout << str << endl;

    return 0;
}

string str = "abc";拷贝初始化(编译器可能优化为直接构造)。

string str("abc");直接初始化,显式调用构造函数。

复制代码
Hello Geeks

2.访问字符

可以用 [] 运算符或 .at() 成员函数访问字符串中的 单个字符。

时间复杂度:O(1)

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello Geeks";

    // 用 [] 访问
    cout << "第一个字符: " << str[0] << endl;
    cout << "第五个字符: " << str[4] << endl;

    // 用 .at() 访问
    cout << "索引 6 处的字符: " << str.at(6) << endl;

    return 0;
}
makefile 复制代码
第一个字符: H
第五个字符: o
索引 6 处的字符: G

3.字符串长度

可以用 size()length() 获取字符串中的字符个数。

时间复杂度:O(1)

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello Geeks";

    // 使用 size()
    cout << ""Length using size(): " << str.size() << endl;

    // 使用 length()
    cout << "Length using length(): " << str.length() << endl;

    return 0;
}
csharp 复制代码
Length using size(): 11
Length using length(): 11

4.字符串拼接

可以用 + 运算符或 append() 函数把两个字符串连接起来。

  • + 运算符会生成一个新的字符串
  • append() 则是在原字符串末尾追加,直接修改原字符串

时间复杂度:O(n + m),其中 n 是原字符串长度,m 是待拼接字符串的长度。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "Hello";
    string str2 = " Geeks";

    // 使用 + 运算符
    string result1 = str1 + str2;
    cout << "Concatenation using + : " << result1 << endl;

    // 使用 append() 函数
    string result2 = str1;
    result2.append(str2);
    cout << "Concatenation using append(): "<< result2 << endl;

    return 0;
}
csharp 复制代码
Concatenation using + : Hello Geeks
Concatenation using append(): Hello Geeks

5.修改字符串

可以用 .push_back() 添加字符,.pop_back() 删除末尾字符,或用 .insert().erase() 进行插入与删除。

  • push_back / pop_backO(1)
  • insert / eraseO(n)(因可能需要移动后续字符)
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello Geeks";

    // 在末尾添加一个字符
    str.push_back('!');
    cout << "push_back 后: " << str << endl;

    // 删除最后一个字符
    str.pop_back();
    cout << "pop_back 后: " << str << endl;

    // 在指定位置插入子串
    str.insert(5, " C++");        // 在第 5 个字符前插入
    cout << "insert 后: " << str << endl;

    // 删除指定区间字符
    str.erase(5, 4);              // 从索引 5 开始删 4 个字符
    cout << "erase 后: " << str << endl;

    return 0;
}
lua 复制代码
push_back 后: Hello Geeks!
pop_back 后: Hello Geeks
insert 后: Hello C++ Geeks
erase 后: Hello Geeks

6.子串提取

使用 .substr(pos, len) 可以从原字符串中提取一段子串:

  • pos:起始位置(从 0 开始计数)
  • len:要提取的字符个数

该函数会返回一个新的字符串 ,包含从 pos 开始的 len 个字符。

时间复杂度:O(len)

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello Geeks";

    // 提取 "Hello"
    string sub1 = str.substr(0, 5);
    cout << "子串 1: " << sub1 << endl;

    // 提取 "Geeks"
    string sub2 = str.substr(6, 5);
    cout << "子串 2: " << sub2 << endl;

    return 0;
}
yaml 复制代码
子串 1: Hello
子串 2: Geeks

7.在字符串中查找

find() 函数用于在字符串内搜索子串。

  • 如果找到,返回子串第一次出现的起始下标(从 0 开始);
  • 如果未找到,返回特殊值 string::npos

时间复杂度:O(n × m),其中 n 是原字符串长度,m 是待查子串长度。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello Geeks";

    size_t pos = str.find("Geeks");   // 查找子串 "Geeks"

    if (pos != string::npos) {        // 也可以写成 pos < str.size()
        cout << "\"Geeks\" 在索引处找到: " << pos << endl;
    }

    return 0;
}
arduino 复制代码
"Geeks" 在索引处找到: 6

C++ 字符串函数

C++ 提供了一系列内置函数用于字符串处理,例如用于拷贝的 strcpy()、用于拼接的 strcat() 等。下面列出常用函数及其作用:

函数 说明
length() 返回字符串长度(字符个数)。
swap() 交换两个字符串的值。
size() 返回字符串大小(与 length() 等价)。
resize() 将字符串长度调整为指定值(可截断或填充)。
find() 查找子串首次出现的位置,未找到返回 string::npos
push_back() 在字符串末尾追加一个字符。
pop_back() 删除字符串最后一个字符。
clear() 清空字符串,使其长度为 0。
strncmp() 比较两个字符串的前 n 个字符(C 风格)。
strncpy() 拷贝源字符串的前 n 个字符到目标字符串(C 风格)。
strrchr() 查找字符在字符串中最后一次出现的位置(C 风格)。
strcat() 将源字符串拼接到目标字符串末尾(C 风格)。
replace() 将字符串中指定区间或子串替换为新内容。
substr() 提取从指定位置开始、指定长度的子串。
compare() 按字典序比较两个字符串,返回整型结果(0 表示相等)。
erase() 删除字符串中指定位置或区间的字符。
rfind() 查找子串最后一次出现的位置。
相关推荐
go_bai2 小时前
Linux--进程池
linux·c++·经验分享·笔记·学习方法
QT 小鲜肉2 小时前
【QT/C++】Qt网络编程进阶:UDP通信和HTTP请求的基本原理和实际应用(超详细)
c语言·网络·c++·笔记·qt·http·udp
实心儿儿3 小时前
C++ —— list
开发语言·c++
仟千意3 小时前
C++:c++基础知识
c++
木木木丫4 小时前
嵌入式项目:韦东山驱动开发第六篇 项目总结——显示系统(framebuffer编程)
c语言·c++·驱动开发·dsp开发
mit6.8244 小时前
[HDiffPatch] 补丁算法 | `patch_decompress_with_cache` | `getStreamClip` | RLE游程编码
c++·算法
杨筱毅5 小时前
【穿越Effective C++】条款13:以对象管理资源——RAII原则的基石
开发语言·c++·effective c++
煤球王子5 小时前
学而时习之:C++中的引用
c++
L_09075 小时前
【Algorithm】Day-11
c++·算法·leetcode