【C++庖丁解牛】STL简介 | string容器初次见面
📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持
目录
- 1. 什么是STL
- 2. STL的版本
- 3. STL的六大组件
- 4. STL的重要性
- 5. 如何学习STL
- 6.STL的缺陷
- 7. 为什么学习string类?
- 8. 标准库中的string类
- 8.1 string类(了解)
- 8.2 string类的常用接口说明(注意下面我只讲解最常用的接口)
- 8.3 string类对象的容量操作
- 8.4 测试string容量相关的接口
- 📖size、length和capacity
- 📖clear接口
- 📖resize接口
- 📖reserve接口
- 📖empty接口
- 8.5 string类对象的访问及遍历操作
- 反向迭代器
- const迭代器
1. 什么是STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2. STL的版本
- 原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。
- P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,
符号命名比较怪异。
- RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
- SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。
3. STL的六大组件
4. STL的重要性
STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一系列的通用模板类和函数,用于实现常用的数据结构和算法。STL的重要性主要体现在以下几个方面:
-
提高开发效率:STL提供了丰富的容器(如vector、list、map等)和算法(如排序、查找、遍历等),可以直接使用这些现成的模板,避免了手动实现这些功能的繁琐过程,大大提高了开发效率。
-
提供高性能的数据结构和算法:STL中的容器和算法都经过精心设计和优化,具有高效的性能。例如,vector提供了快速的随机访问和动态扩容的能力,而算法库中的排序和查找算法采用了高效的实现方式,可以在大规模数据处理中获得较好的性能。
-
代码可重用性:STL中的容器和算法都是通用的,可以适用于各种类型的数据。通过使用STL,我们可以编写出更加通用、可复用的代码,提高代码的可维护性和可扩展性。
-
标准化和规范化:STL是C++标准库的一部分,它定义了一套统一的接口和规范,使得不同的开发者可以使用相同的方式来操作数据结构和算法。这样可以提高代码的可读性和可理解性,方便代码的交流和共享。
-
丰富的功能和灵活性:STL提供了多种容器和算法的选择,可以根据具体的需求选择合适的容器和算法。同时,STL还支持自定义类型的容器和算法,可以根据实际情况进行扩展和定制。
在工作中
网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。
5. 如何学习STL
学习STL(Standard Template Library)是C++程序员的重要一步,它提供了一组通用的数据结构和算法,可以大大提高代码的复用性和开发效率。以下是学习STL的一些建议:
-
理解STL的组成部分:STL由容器(Containers)、迭代器(Iterators)和算法(Algorithms)三个主要组成部分构成。容器用于存储数据,迭代器用于访问容器中的元素,算法用于对容器中的元素进行操作和处理。
-
学习STL的容器:STL提供了多种容器,如vector、list、set、map等。每种容器都有自己的特点和适用场景,需要了解它们的特性、操作方法和性能特点。
-
掌握STL的迭代器:迭代器是STL中非常重要的概念,它提供了一种统一的访问容器元素的方式。了解迭代器的种类和使用方法,能够灵活地遍历和操作容器中的元素。
-
熟悉STL的算法:STL提供了丰富的算法,如排序、查找、变换等。学习这些算法的使用方法和适用场景,能够快速地解决各种常见的问题。
-
阅读STL的源码和文档:阅读STL的源码可以深入理解其实现原理和设计思想,同时也可以学习到一些高效的编程技巧。此外,还可以参考STL的官方文档或相关书籍,了解更多细节和使用技巧。
-
实践和练习:通过实际的项目或练习题来应用STL,加深对其的理解和掌握。可以尝试使用STL解决一些常见的问题,提高自己的编程能力。
简单总结一下:学习STL的三个境界:能用,明理,能扩展 。
6.STL的缺陷
- STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出
来已经相隔了13年,STL才进一步更新。
- STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
- STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
- STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。
7. 为什么学习string类?
学习string类是因为它是C++中用于处理字符串的重要类之一。使用string类可以方便地进行字符串的操作和处理,包括字符串的连接、截取、查找、替换等。相比于C风格的字符串处理函数,string类提供了更多的功能和便利性。
通过学习string类,你可以掌握以下知识点:
- 字符串的创建和初始化:可以使用构造函数或者赋值操作符来创建和初始化string对象。
- 字符串的基本操作:可以使用成员函数来获取字符串的长度、访问特定位置的字符、比较字符串等。
- 字符串的连接和拼接:可以使用加号运算符或者成员函数来实现字符串的连接和拼接。
- 字符串的截取和提取:可以使用成员函数来截取子串或者提取特定位置的字符。
- 字符串的查找和替换:可以使用成员函数来查找子串或者替换特定字符或子串。
- 字符串的转换和格式化:可以使用成员函数来实现字符串与其他数据类型之间的转换,以及字符串的格式化输出。
总之,学习string类可以帮助你更加高效地处理字符串,提高编程效率和代码可读性。
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
8. 标准库中的string类
8.1 string类(了解)
可以自行查看一下string类的文档介绍
- 字符串是表示字符序列的类
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
- 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,typedef basic_string string;
- 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include头文件以及using namespace std;
8.2 string类的常用接口说明(注意下面我只讲解最常用的接口)
- string类对象的常见构造
(constructor)函数名称 功能说明 string() (重点) 构造空的string类对象,即空字符串 string(const char* s) (重点) 用C-string来构造string类对象 string(size_t n, char c) string类对象中包含n个字符c string(const string&s) (重点) 拷贝构造函数 这里重点示范三个重点的string构造:
#include using namespace std; int main() { string s1; // 构造空的string类对象s1 string s2("hello world"); // 用C格式字符串构造string类对象s2 string s3(s2); // 拷贝构造s3 cout // 注意:string类对象支持直接用cin和cout进行输入和输出 string s("hello, world!!!"); cout string s("hello, world!!!"); s.clear(); cout string s("hello"); s.resize(10, 'a'); cout string s("hello"); s.resize(15); cout string s("hello world"); s.resize(5); cout string s; cout string s; int i = s.empty(); cout string s("hello Bit"); // 3种遍历方式: // 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符, // 另外以下三种方式对于string而言,第一种使用最多 // 1. for+operator[] for (size_t i = 0; i
-
- 原始版本