C++ 中的 `string` 类型:全面解析与高效操作

发布于:2025-02-10 ⋅ 阅读:(59) ⋅ 点赞:(0)

C++ 中的 string 类型:全面解析与高效操作

在 C++ 中,string 类型是对字符数组的高级封装,它提供了大量内置函数,使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同,string 类型不仅自动管理内存,还提供了更丰富的操作方法。本文将通过详细讲解 string 类型的概念、常见操作及相关函数,帮助你快速掌握这一强大工具。


1. string 类型的概念

在 C++ 中,string 类型属于标准库中的 std 命名空间。它实际上是一个类,封装了字符串操作的多个方法,使得我们无需手动管理字符数组的内存,避免了 C 语言中的常见问题(如字符串长度限制、手动添加结束符\0)。通过 string 类型,我们可以更方便、更安全地操作文本数据。

创建 string 对象

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

int main() {
    string s1;         // 创建空字符串
    string s2 = "abc"; // 创建并初始化字符串

    cout << "s1: " << s1 << endl; // 输出空字符串
    cout << "s2: " << s2 << endl; // 输出 abc
    return 0;
}
  • string s1; 创建一个空字符串。
  • string s2 = "abc"; 通过字面量初始化字符串。

2. 常见的 string 操作

2.1 字符串的输入与输出

使用 cin 输入字符串
string s;
cin >> s; // 读取不带空格的字符串
cout << s << endl; // 输出输入的字符串
  • cin 读取时遇到空格会停止。
使用 getline 输入带空格的字符串

getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本,并将其存储为字符串。与 cin 不同,getline 可以读取包括空格在内的整行字符串。

1. getline 的第一种形式

格式:

istream& getline(istream& is, string& str);
  • 这种形式的 getline 以换行符(\n)作为字符串的结束标志。
  • 它从输入流中读取文本,直到遇到换行符为止,然后将读取到的文本(不包括换行符)存储到指定的 string 类型变量 str 中。

示例代码:

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

int main() {
    string name;
    getline(cin, name);  // 从键盘读取一行文本
    cout << name << endl;  // 输出读取的字符串
    return 0;
}

运行时,输入的字符串(包括空格)将被读取并存储在 name 变量中,然后输出。

2. getline 的第二种形式

格式:

istream& getline(istream& is, string& str, char delim);
  • 这种形式允许用户自定义结束标志(delim),即指定一个字符作为字符串的结束标志。
  • 它会从输入流中读取文本,直到遇到指定的字符为止,然后将读取到的文本(不包括该字符)存储到指定的 string 类型变量 str 中。

示例代码:

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

int main() {
    string name;
    getline(cin, name, 'q');  // 从键盘读取一行文本,直到遇到字符 'q'
    cout << name << endl;  // 输出读取的字符串
    return 0;
}

在这个例子中,输入的文本会读取直到遇到字符 q 为止。q 字符不会被包含在最终的字符串中。

小提示:

在使用 C++ 中的 string 字符串时,如果字符串中需要包含空格,getline 函数是必须的。它在字符串输入时非常常见,尤其是在竞赛中处理字符串输入时,通常会使用 string 类型的字符串。


2.2 获取字符串长度

使用 size() 获取字符串的长度。

string s = "hello";
cout << "Length of string: " << s.size() << endl; // 输出 5
  • size() 返回字符串的字符数。

2.3 迭代器操作

C++ 中的 string 提供了迭代器,可以用于遍历字符串中的元素。(不过访问迭代器指向的值,需要解引⽤(*)。)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1f32b64b16064647b8c954ebc39c7ee5.png

正序遍历
string s = "abcdef";
for (auto it = s.begin(); it != s.end(); ++it) {
    cout << *it << " "; // 输出字符
}

在这里插入图片描述

逆序遍历
string s = "abcdef";
for (auto it = s.end() - 1; it >= s.begin(); --it) {
    cout << *it << " "; // 输出字符
}

✅ ⼩提⽰:
• 迭代器是可以进⾏⼤⼩⽐较,也可以进⾏ + 或者 - 整数运算的。
⽐如: it++ ,就是让迭代器前进⼀步, it-- 就是让迭代器退后⼀步。
• 同⼀个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个
数。


2.4 添加字符:push_back()

push_back() 用于在字符串末尾添加一个字符。

string s = "hello";
cout << s << endl;  // 输出 hellow

在这里插入图片描述


2.5 字符串拼接:+=+ 运算符

C++ 中的 string 支持 +=+ 运算符,用于字符串拼接。

string s1 = "hello";
s1 += " world";  // 拼接字符串
cout << s1 << endl;  // 输出 hello world

string s2 = "hello";
cout << s2 + " world" << endl;  // 输出 hello world

在这里插入图片描述


2.6 删除字符:pop_back()

pop_back() 用于删除字符串末尾的一个字符。

string s = "hello";
s.pop_back();  // 删除 'o'
cout << s << endl;  // 输出 hell

在这里插入图片描述

  • 注意:当字符串为空时,再调用 pop_back() 会导致程序崩溃。

2.7 插入字符:insert()

insert() 方法允许你在字符串的指定位置插入字符或子串。

插入字符串
string s = "abcdefghi";
s.insert(3, "xxx");  // 在位置3插入字符串 "xxx"
cout << s << endl;  // 输出 abcdxxxefghi

在这里插入图片描述

插入多个相同字符
s.insert(3, 3, 'x');  // 在位置3插入3个字符 'x'
cout << s << endl;  // 输出 abcdxxxefghi

2.8 查找字符串:find()

find() 方法用于查找字符串中的子串或字符,并返回第一次出现的位置。若未找到,则返回 string::npos

查找子串
string s = "hello world hello everyone";
size_t pos = s.find("llo");
cout << "Found 'llo' at position: " << pos << endl;  //输出2

在这里插入图片描述

查找字符
string s = "hello world";
size_t pos = s.find('o');
cout << "Found 'o' at position: " << pos << endl;  // 输出 4
查找失败
string s = "hello world";
size_t pos = s.find("xyz");
if (pos != string::npos) {
    cout << "Found at position: " << pos;
} else {
    cout << "Not found" << endl;
}

2.9 截取子串:substr()

substr() 用于从字符串中截取子串,支持指定位置和长度。

截取指定位置后的子串
string s = "hello world";
string sub = s.substr(7);
cout << sub << endl;  // 输出 world

在这里插入图片描述

截取指定位置和长度的子串
string s = "hello world";
string sub = s.substr(7, 6);
cout << sub << endl;  // 输出 orld h

在这里插入图片描述


2.10 字符串关系运算符

C++ 提供了一些常用的字符串比较运算符,如 ==!=<> 等,比较是基于字典顺序进行的。

字符串相等比较
string s1 = "hello";
string s2 = "hello";
if (s1 == s2) {
    cout << "Equal" << endl;  // 输出 Equal
}
字符串大小比较
string s1 = "apple";
string s2 = "banana";
if (s1 < s2) {
    cout << "apple is less than banana" << endl;
}

2.11 字符串转数字:stoi()stol()stod()

这些函数将字符串转换为整数、长整型或浮点型。

string s = "123";
int num = stoi(s);
cout << num << endl;  // 输出 123

string s2 = "3.14";
double pi = stod(s2);
cout << pi << endl;  // 输出 3.14

在这里插入图片描述


2.12 将数字转换为字符串:to_string()

to_string() 将数字转换为字符串。

int num = 123;
string str = to_string(num);
cout << str << endl;  // 输出 123

3. 总结

C++ 的 string 类型为处理字符串提供了强大而高效的工具。通过使用诸如 insert()find()substr() 等函数,我们可以轻松地在字符串中进行插入、查找、截取等操作,避免了传统字符数组的复杂性。此外,运算符重载和转换函数使得字符串与其他数据类型之间的转换变得简便。掌握这些技巧,你将能够在实际开发中更高效地处理字符串相关问题。


网站公告

今日签到

点亮在社区的每一天
去签到