【C++初阶】string

慈云数据 7个月前 (05-09) 技术支持 42 0

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿

🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟

🌟🌟 追风赶月莫停留 🌟🌟

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

🌟🌟 平芜尽处是春山🌟🌟

🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟

🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋string类

  • 🍑STL简介
    • 🍍STL的由来
    • 🍍STL的发展
    • 🍍STL的版本
    • 🍍STL的六大组件
    • 🍍STL的重要性
    • 🍑string构造(constructor)
      • 🍍无参构造
      • 🍍带参的字符串构造
      • 🍍拷贝构造
      • 🍍指定位置构造
      • 🍍指定数据拷贝
      • 🍍填充
      • 🍑string析构(destructor)
      • 🍑string赋值(operator=)
      • 🍑string遍历和访问
        • 🍍获取string长度
        • 🍍获取string类str中的字符
        • 🍍迭代器
        • 🍍逆置函数
        • 🍍反向迭代器
        • 🍍开空间函数
        • 🍍查看空间容量
        • 🍑string增删查改
          • 🍍增
          • 🍍删
          • 🍍找
          • 🍍改

            🍑STL简介

            🍍STL的由来

            最初是由一位美国科学家提出。当时,美国计算机科学家Alexander Stepanov在Hewlett-Packard公司的实验室中工作,他在编写与计算机科学相关的程序时,深感程序员需要一种通用的编程模式,以便更加方便地实现各种数据结构和算法。基于这种认识,他开始着手设计一种新的C++库,这便是STL的雏形。

            STL最初由Andrew Koenig和其他C++专家小组进行设计,并在1995年C++标准委员会的推荐下,成为C++标准库的一部分。STL的早期版本,即SGI-STL(Silicon Graphics STL),由Alexander Stepanov和Meng Lee在Silicon Graphics公司开发,并在1994年的SGI工作站上发布。虽然这是STL的雏形,但它并不是一个标准的C++库。

            然而,STL的潜力被很快认识到,许多厂商和开源社区开始采用并进一步发展它。出于对SGI拥有版权的限制,后来形成了多个同源的STL版本,如STLport、Apache STL等。

            🍍STL的发展

            首先,STL的原型最初由Andrew Koenig和其他C++专家小组设计,并在1995年得到了C++标准委员会的推荐,从而正式成为C++标准库的一部分。这个早期的STL版本为C++程序员提供了一组通用的数据结构和算法,大大简化了C++程序的开发过程。

            然后,STL的发展进入了另一个重要阶段,那就是SGI-STL(Silicon Graphics STL)版本的诞生。这个版本由Alexander Stepanov和Meng Lee在Silicon Graphics公司开发,并在1994年发布。SGI-STL为STL的发展奠定了坚实的基础,它的出现推动了STL在业界的广泛接受和应用。

            随着C++标准的不断更新,STL也得到了持续的发展。从C++03的修订版开始,STL在容器、迭代器、算法等方面都得到了进一步的扩展和优化。特别是C++11标准的发布,为STL带来了许多新的特性和改进。例如,C++11中新增了多种容器类型(如std::array、std::forward_list、std::unordered_map等),以及智能指针(如std::unique_ptr、std::shared_ptr等),这些新特性大大增强了STL的功能和实用性。

            🍍STL的版本

            1. 原始版本(HP 版本):Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP版本是所有STL实现版本的始祖。
            2. P. J. 版本:由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,

              符号命名比较怪异。

            3. RW版本:由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
            4. SGI版本:由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

            🍍STL的六大组件

            1. 容器:容器是STL中最重要的组件之一,它提供了各种数据结构,如vector、list、deque、set、map等。这些容器用于存储和管理数据,并提供了对数据的基本操作。
            2. 算法:STL包含了一系列算法,用于对容器中的数据进行各种操作,如排序、搜索、复制、删除等。这些算法以函数模板的形式实现,可以与容器和迭代器一起使用,实现灵活且高效的数据处理
            3. 迭代器:迭代器是STL中用于遍历容器元素的工具。它们提供了一种抽象化的方式,使得程序员可以像操作指针一样操作容器中的元素。迭代器在算法和容器之间起到了桥梁的作用,使得算法可以无缝地应用于各种容器。
            4. 仿函数:仿函数也被称为函数对象,其行为类似于函数,但实际上是重载了operator()的class或class template。它们可以作为算法的某种策略,用于定制算法的行为。
            5. 适配器:适配器是一种修饰容器、仿函数或迭代器接口的工具。它们可以改变容器、仿函数或迭代器的行为,使其适应不同的使用场景。例如,STL中的queue和stack就是使用deque作为底层容器实现的适配器。
            6. 配接器:配接器主要用于管理STL容器在分配和释放内存时的行为。它负责提供自定义的内存管理策略,以满足特定应用程序的需求。虽然配接器也是STL的一个重要组件,但在某些资料或讨论中可能不被单独列出为六大组件之一。

            🍍STL的重要性

            首先,STL大大简化了C++编程的复杂性。它提供了一套高效且易于使用的数据结构和算法,使得程序员无需从头开始实现这些基础功能,从而可以将更多的精力投入到业务逻辑的实现上。

            其次,STL提高了代码的可重用性和可维护性。通过使用STL中的通用模板,程序员可以编写出更加通用和灵活的代码,减少了重复劳动和代码冗余。同时,STL也遵循严格的编程规范和标准,使得代码更加易于理解和维护。

            再者,STL的性能优化也是其重要性的体现之一。STL中的数据结构和算法都经过了精心设计和优化,能够在各种场景下提供高效的性能表现。这使得使用STL的C++程序在运行时能够更加快速和稳定。

            最后,STL的广泛应用也证明了其重要性。无论是在学术研究、商业开发还是个人项目中,STL都得到了广泛的应用和认可。它已经成为了C++程序员必备的工具之一,也是学习C++编程的重要组成部分。

            STL在C++编程中的重要性不言而喻。它简化了编程复杂性、提高了代码的可重用性和可维护性、优化了性能表现,并且得到了广泛的应用和认可。因此,对于想要深入学习C++编程的程序员来说,掌握STL是非常必要的。

            🍑string构造(constructor)

            关于STL中容器string类,头文件名为#include

            🍍无参构造

            string()

            string  str;
            

            在这里插入图片描述

            无参构造就是空的string类对象。

            🍍带参的字符串构造

            string(const char* str)

            string str("hello world");
            

            在这里插入图片描述

            🍍拷贝构造

            string(const string& str)

            string  str1("hello wrold");
            string  str2(str1);
            

            在这里插入图片描述

            🍍指定位置构造

            string(const string& str, size_t pos, size_t len = npos),npos是一个全局变量,赋值为-1,防止给的参数太大。

            string str1("hello world");
            string str2(str1, 1, 6);
            //从str1的第一个位置后开始拷贝,拷贝6个数据,
            //空格也算一个位置,从首字母开始计算。
            

            在这里插入图片描述

            🍍指定数据拷贝

            string(const string& str, size_t n)

            string str1("hello world");
            string str2(str1, 3);
            

            在这里插入图片描述

            🍍填充

            string(size_t n, char str)

            string str(10, 'a');
            

            在这里插入图片描述

            🍑string析构(destructor)

            ~string();
            

            析构函数系统会自动调用。

            🍑string赋值(operator=)

            string str1("hello world");
            string str2 = str1;
            string str3 = "hello world";
            

            在这里插入图片描述

            🍑string遍历和访问

            🍍获取string长度

            string str("hello world");
            cout 
            	cout 
            	cout 
            	cout 
            	cout 
            	cout 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon