【C++入门到精通】C++入门 —— string类(STL)下

简介: 【C++入门到精通】C++入门 —— string类(STL)下

⭕子串操作


       在 std::string类中,提供了多种方法来进行子串操作,即从一个字符串中获取部分字符组成新的子串。这些方法可以用于检索、提取和操作字符串的特定部分。


✅substr() 函数

substr(pos, count):从位置 pos 开始,提取长度为 count 的子串。


std::string str = "Hello, World!";
std::string sub1 = str.substr(0, 5);   // 获取从位置0开始的5个字符,得到子串"Hello"
std::string sub2 = str.substr(7);      // 获取从位置7开始到末尾的子串,得到子串"World!"

✅getline() 函数

getline(input_stream, str, delimiter):从输入流 input_stream 中读取一行字符,并将结果存储在字符串 str 中,以指定的分隔符 delimiter 结束,分隔符默认为换行符。


std::string input;
std::getline(std::cin, input);   // 从标准输入读取一行字符,存储在input字符串中

✅find() 函数

find(substring, pos):从位置 pos 开始,在字符串中搜索子串 substring,返回第一次出现的位置;如果未找到,返回 std::string::npos


std::string str = "Hello, World!";
size_t pos = str.find("World");    // 在字符串中搜索子串"World",得到位置7

✅rfind()函数

rfind(substring, pos):从字符串中的pos位置开始,从后向前搜索子串substring,返回最后一次出现的位置。如果找不到子串,则返回std::string::npos。


std::string str = "Hello, World!";
size_t pos = str.rfind("o");    // 从位置12开始,从后向前搜索字符"o",得到位置8

✅find_first_of()函数

find_first_of(chars, pos):从字符串中的pos位置开始,搜索位于字符集chars中的任何一个字符第一次出现的位置。如果找不到任何字符,则返回std::string::npos


std::string str = "Hello, World!";
size_t pos = str.find_first_of("Wdl");    // 从位置0开始,在字符串中搜索字符集"Wdl"中的

任一字符,得到位置2(字符"l"第一次出现的位置)

✅find_last_of()函数

find_last_of(chars, pos):从字符串中的pos位置开始,从后向前搜索位于字符集chars中的任何一个字符最后一次出现的位置。如果找不到任何字符,则返回std::string::npos


std::string str = "Hello, World!";
size_t pos = str.find_last_of("odl");    // 从位置12开始,从后向前搜索字符集"odl"中的任一字符,得到位置10(字符"l"最后一次出现的位置)

✅replace() 函数:

replace(pos, count, new_string):从位置 pos 开始,替换长度为 count 的子串为 new_string


std::string str = "Hello, World!";
str.replace(7, 5, "Everyone");     // 从位置7开始,将长度为5的子串"World"替换为字符串"Everyone"

       通过这些子串操作方法,可以方便地提取特定的子串、查找特定的字符位置、替换子串等,以满足具体的字符串处理需求。


⭕字符串比较


       在std::string类中,提供了多种方法来进行字符串的比较操作,用于判断两个字符串是否相等或者确定它们的大小关系。这些方法可以通过操作符重载和成员函数来实现。


✅操作符重载

  • == :检查两个字符串是否相等。
  • != :检查两个字符串是否不相等。
  • < :检查第一个字符串是否小于第二个字符串(按字典序比较)。
  • > :检查第一个字符串是否大于第二个字符串(按字典序比较)。
  • <= :检查第一个字符串是否小于等于第二个字符串(按字典序比较)。
  • >= :检查第一个字符串是否大于等于第二个字符串(按字典序比较)。
std::string str1 = "Hello";
std::string str2 = "World";
bool isEqual = (str1 == str2);    // 判断两个字符串是否相等
bool isNotEqual = (str1 != str2); // 判断两个字符串是否不相等
bool isLess = (str1 < str2);      // 判断str1是否小于str2
bool isGreater = (str1 > str2);   // 判断str1是否大于str2
bool isLessOrEqual = (str1 <= str2);    // 判断str1是否小于等于str2
bool isGreaterOrEqual = (str1 >= str2); // 判断str1是否大于等于str2

✅成员函数

compare(str):按字典序比较当前字符串和参数字符串str。返回一个整数,表示比较结果。


  • 返回值 < 0:当前字符串小于str。
  • 返回值 > 0:当前字符串大于str。
  • 返回值 = 0:当前字符串等于str。
std::string str1 = "Hello";
std::string str2 = "World";
int result = str1.compare(str2);   // 比较str1和str2


⭕字符串修改


       在std::string类中,提供了多种方法来修改字符串的内容,这些方法可以用于插入、删除、替换字符或子串,以及改变字符串的大小等操作。


✅插入字符或子串

insert(pos, str):在指定位置 pos 前插入字符串 str


insert(pos, str, subpos, sublen):在指定位置 pos 前插入字符串 str 的子串,子串长度为 sublen,起始位置为 subpos


std::string str = "Hello";
str.insert(5, "World");      // 在位置5前插入字符串"World",得到字符串"HelloWorld"
str.insert(0, "I am ", 2, 4);// 在位置0前插入字符串"I am "的子串"am ",得到字符串"am HelloWorld"

✅删除字符或子串

erase(pos, count):从指定位置 pos 开始,删除 count 个字符。


std::string str = "Hello, World!";
str.erase(5, 7);            // 从位置5开始删除7个字符,得到字符串"Hello!"

✅替换字符或子串

replace(pos, count, str):从指定位置 pos 开始,将长度为 count 的子串替换为字符串 str


std::string str = "Hello, World!";
str.replace(7, 5, "Everyone");  // 从位置7开始,将长度为5的子串"World"替换为字符串"Everyone",得到字符串"Hello, Everyone!"

✅改变字符串大小

resize(new_size):改变字符串的大小为 new_size,截断或填充空字符。


resize(new_size, fill):改变字符串的大小为 new_size,使用字符 fill 填充。


std::string str = "Hello";
str.resize(10);            // 将字符串大小改变为10,默认用空字符填充,得到字符串"Hello     "
str.resize(7, '!');        // 将字符串大小改变为7,用字符'!'填充,得到字符串"Hello!!"

       通过这些字符串修改方法,可以方便地插入、删除、替换字符或子串,以及改变字符串的大小,以满足不同的字符串处理需求。根据具体情况选择最适合的方法来修改字符串。


⭕获取字符的ASCII码


       在C++的std::string类中,可以使用索引操作符[]或成员函数at()来获取字符串中特定位置字符的ASCII码。


✅索引操作符[]

str[index]:返回字符串str中位置为index的字符的ASCII码。请注意,索引从0开始。


std::string str = "Hello";
char ch = str[0];         // 获取字符串第一个字符'H'
int ascii = static_cast<int>(ch);   // 转换字符为ASCII码

✅成员函数at():

str.at(index):返回字符串str中位置为index的字符的ASCII码。如果索引超出了字符串的范围,at()函数会抛出std::out_of_range


std::string str = "Hello";
char ch = str.at(1);      // 获取字符串第二个字符'e'
int ascii = static_cast<int>(ch);   // 转换字符为ASCII码

       在上面的代码中,我们先获取到字符串中特定位置的字符,然后使用static_cast(ch)将字符转换为相应的ASCII码。注意,将字符转换为整数类型可以使用static_cast来进行显式类型转换。


⭕字符串大小写转换:


       在C++的std::string类中,提供了一些方法来进行字符串的大小写转换操作。这些方法可以将字符串中的字符转换为大写或小写形式。


✅换为大写

toupper()函数:将字符串中的字符转换为大写形式。


std::string str = "Hello, World!";
for (char& c : str) {
    c = std::toupper(c);   // 将字符转换为大写形式
}

✅换为小写

tolower()函数:将字符串中的字符转换为小写形式。


std::string str = "Hello, World!";
for (char& c : str) {
    c = std::tolower(c);   // 将字符转换为小写形式
}

       在上面的代码中,我们使用循环遍历字符串中的每个字符,并通过std::toupper()和std::tolower()函数将其转换为大写或小写形式。请注意,这些函数返回转换后的字符,并且在循环中我们通过引用来修改原始字符串。


✅C++标准库转换

       除了使用循环遍历字符进行转换,还可以使用C++标准库算法和字符串迭代器来实现字符串的大小写转换:


#include <algorithm>
#include <cctype>
std::string str = "Hello, World!";
std::transform(str.begin(), str.end(), str.begin(), ::toupper);   // 将字符串转换为大写形式
std::transform(str.begin(), str.end(), str.begin(), ::tolower);   // 将字符串转换为小写形式

       在上面的代码中,我们使用std::transform()算法和字符处理函数::toupper和::tolower来实现字符串的大小写转换。::toupper和::tolower是函数指针,用于执行字符的大写和小写转换。


总结


       本文通过对STL(Standard Template Library)和string类的介绍,为读者提供了对STL和string类的全面了解。在STL简介部分,我们了解到STL是C++标准库的重要组成部分,分别是容器、算法、迭代器、函数对象、适配器和分配器六个核心内容,使用前需要掌握C++的基本语法和模板的使用。在string类部分,我们深入研究了string类的定义、特点和常见操作。构造和初始化包括使用初始化列表初始化和初始化总结,字符串大小和容量提供了获取字符串大小和容量的方法,字符访问和修改可以方便地操作字符串的字符,字符串连接和拼接可以合并字符串,子串操作可以从字符串中提取子串。字符串比较提供了多种方法来比较字符串的大小关系,字符串修改可以插入、删除和替换字符或子串,获取字符的ASCII码可以得到字符的ASCII码值,而字符串大小写转换可以将字符串转换为大写或小写形式。通过本文的学习,读者将掌握STL的基本概念和string类的常用操作,从而能够更加灵活和高效地处理和操作字符串。


温馨提示


       感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!


       再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

7c319c17abbcbb2c09c5b8e2fccb5364_86b16535c35542b6b64787db3c833a2b.jpeg


目录
相关文章
|
7月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
11月前
|
对象存储 C++ 容器
c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
216 3
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
522 12
|
11月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
275 0
|
11月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
443 0
|
11月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
171 0
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
7月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
456 5
|
11月前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
268 0
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
385 11