【C++打怪之路Lv8】-- string类

简介: 【C++打怪之路Lv8】-- string类

STL六大组件



什么是string


在 C++ 中,string 是标准库中的一个类,它用于表示和处理字符串

string 类是定义在 <string> 头文件中的,它提供了丰富的成员函数来支持字符串的各种操作,如拼接、查找、替换等。

底层实现

string 类的底层实现通常依赖于动态数组,这个动态数组用于存储字符序列

具体来说,它通常包含以下三个部分:

  1. 字符数组:用于存储实际的字符串数据。
  2. 长度:记录当前字符串中的字符数量。
  3. 容量:记录当前分配的内存可以容纳的字符数量

以下是string类的私有成员:

template <typename _CharT, typename _Traits, typename _Alloc>
class basic_string {
private:
        _CharT* _MyPtr;       // 指向分配的内存的指针
        size_t _size;         // 字符串的长度
        size_t _capacity;     // 分配的内存容量
};


为什么要学习string


  1. 抽象度高:`string`提供高级抽象,简化内存管理。
  2. 功能丰富:内置操作集,提升开发效率。
  3. 安全性好:预防缓冲区溢出,保障程序安全。
  4. 跨平台:标准库组件,确保代码可移植性。

简单来说就是:省事、安全、通用、强大

  1. 省事:用`string`处理文字更方便,不用手动管理内存。
  2. 安全:用`string`不容易出错,减少程序崩溃的风险。
  3. 通用:不管在哪个系统,`string`的表现都一样,方便移植。
  4. 强大:`string`能干的事情多,比如查找、替换文字都很简单。


string常用接口


构造函数

1、无参构造函数

函数原型:string();
创建了一个空的string对象

2、带参构造函数

函数原型:string(const char* s);
用字符串(即以'\0'结尾的字符数组)初始化string对象

3、拷贝构造函数

函数原型:string& operator=(const string& str);
这个操作符重载函数允许你使用一个string对象来赋值给另一个已经存在的string对象

4、构造n个单字符函数

函数原型:string(size_t n,char c);
创建一个包含n个字符cstring对象


容量操作接口


1、size();

size_t size() const;

返回字符串中字符的数量

2、length();

size_t length() const;

与size()函数作用相同,实际没有什么区别; 返回字符串中字符的数量

3、capacity();

size_t capacity() const;

返回字符串当前容量,即在不重新分配内存的情况下,字符串可以容纳的最大字符数

简单来说就是:像文本文件当前可以容纳多少字符而不会超出文件系统的分配

4、reserve();

void reserve(size_t new_cap);

用来设置字符串的容量至少为new_cap

5、resize();

void resize(size_t  n);

用来改变字符串的长度到n个字符

代码 && 4、5点总结


访问和遍历


1、operator[]

char& operator[](sizet pos);
允许像访问数组一样访问字符串中的单个字符。它返回指定位置pos的字符的引用

如果你提供的索引超出了字符串的范围,它不会检查边界,可能会导致未定义行为

2、迭代器

①正向迭代器:iterator begin();

②反向迭代器:reverse_iterator rbegin();

正向迭代器begin()返回指向字符串第一个字符的迭代器,

而反向迭代器rbegin()返回指向字符串最后一个字符的迭代器。

迭代器可以用来遍历字符串中的所有字符。

迭代器的本质是范围for

3、at

char& at(sizet pos);

返回指定位置pos的字符的引用

operator[]不同的是,如果pos超出了字符串的范围,at会抛出一个std::out_of_range异常。

4、front and back

front原型:char& front();

back原型:char& back();

front()返回字符串第一个字符的引用,

back()返回字符串最后一个字符的引用

如果字符串为空,这些操作将导致未定义行为

5、find and rfind (与npos)

find原型:sizet find(const string& str, sizet pos 0) const;

rfind原型:sizet rfind(const string& str, sizet pos npos) const;

find()从字符串的起始位置开始查找子字符串str返回第一次出现的位置索引。如果找不到,返回npos

rfind()从字符串的末尾开始查找子字符串str,返回最后一次出现的位置索引。如果找不到,也返回npos

什么是npos?

npos是std::string类中的一个静态常量成员,表示不存在的位置,它的值通常是一个非常大的数,可以认为是字符串的最大可能大小加1

当查找函数返回npos时,意味着没有找到匹配项

6、c_str

const char* c_str() const;
返回一个指向以空字符终止的字符数组的指针,这个数组与字符串的内容相同。

这通常用于在需要C风格字符串的函数中使用std::string对象


修改字符串操作


1、operator+=

string& operator+=(const string& str); //追加一个string类
string& operator+=(const char* s);     //追加字符串
string& operator+=(char c);            //追加字符

用于将一个字符串或字符追加到当前字符串的末尾

2、push_back

void push_back(char c);

用于将一个字符添加到字符串的末尾

3、append

string& append(const string& str);        // 追加string
string& append(const char* s);            // 追加字符串
string& append(const char* s, size_t n);  // 追加字符串的前n个字符
string& append(size_t n, char c);         // 追加n个字符

用于将字符串或字符序列追加到当前字符串的末尾

4、insert

string& insert(size_t pos, const string& str);
string& insert(size_t pos, const char* s);
string& insert(size_t pos, const char* s, size_t n);
string& insert(size_t pos, size_t n, char c);
iterator insert(iterator p, char c);
void insert(iterator p, size_t n, char c);
void insert(iterator p, iterator first, iterator last);

用于在字符串的指定位置插入另一个字符串或字符序列

5、erase

string& erase(size_t pos = 0, size_t len = npos);
iterator erase(iterator p);
iterator erase(iterator first, iterator last);

用于从字符串中移除字符,可以移除单个字符,也可以移除一个范围内的字符

6、swap

void swap(string& str);

用于交换两个字符串的内容

7、operator+

string operator+(const string& str1, const string& str2);
string operator+(const string& str, const char* s);
string operator+(const char* s, const string& str);
string operator+(const string& str, char c);
string operator+(char c, const string& str);

用于连接两个字符串或字符串与字符

8、getline

istream& getline(istream& is, string& str, char delim = '\n');

用于从输入流中读取一行,直到遇到指定的分隔符(默认是换行符),并将其存储到字符串中。


各种运算符重载函数


1、operator>> and operator<<

istream& operator>>(istream& is, string& str);
ostream& operator<<(ostream& os, const string& str);
  • operator>>:这个运算符重载用于从输入流(如 cin)读取字符串。它读取直到下一个空白字符(空格、制表符或换行符)为止的字符序列,并将其存储到字符串中
  • operator<<:这个运算符重载用于将字符串输出到输出流(如 cout)。它将字符串的内容输出到流中。

2、比较运算符,根据ASCII码值比较

bool operator==(const string& str) const;
bool operator!=(const string& str) const;
bool operator<(const string& str) const;
bool operator>(const string& str) const;
bool operator<=(const string& str) const;
bool operator>=(const string& str) const;

目录
打赏
0
1
1
0
17
分享
相关文章
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
39 16
|
12天前
|
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
41 11
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
18天前
|
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
16天前
|
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
58 6
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等