【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


目录
相关文章
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
98 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
70 2
|
3月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
78 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
3月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
78 2
|
3月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
39 1
|
4月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
53 0
java基础(13)String类
|
4月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
3月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
75 4
|
3月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
39 2
|
3月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
59 4