【C++初阶】string

发布于:2024-05-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍑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 << str.size() << endl;
cout << str.length() << endl;

在这里插入图片描述
两个都不计算斜杠0,但都计算空格的大小。

🍍获取string类str中的字符

下标法:

string str("hello world");
for (size_t i = 0; i < str.size(); i++)
{
	cout << str[i] << " ";
}
cout << endl;

在这里插入图片描述

范围for:

string str("hello world");
for (auto ch : str)
{
	cout << ch << " ";
}
cout << endl;

在这里插入图片描述

🍍迭代器

iterator,该迭代器的用法有点像指针

string str("hello world");
string::iterator it = str.begin();
while(it != str.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

在这里插入图片描述
迭代器的用法很多,上面范围for底层就是迭代器,等后面大家学的知识多了,就能理解了。

🍍逆置函数

reverse(), 也是搭配了迭代器使用

string str("hello world");
reverse(str.begin(), str.end());
string::iterator it = str.begin();
while(it != str.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

在这里插入图片描述
该逆置函数,可逆置大部分数据类型 ,如链表、栈等等。

🍍反向迭代器

reverse_iterator

string str("hello world");
string::reverse_iterator rit = str.rbegin();
while(rit != str.rend())
{
	cout << *rit << " ";
	++rit;
}
cout << endl;

在这里插入图片描述

🍍开空间函数

reserve(), resize()

string str1("hello world");
str1.reserve(4);
string str2("hello world");
str2.size(4);

在这里插入图片描述
从程序运行结果来看:
reserve()开空间只影响容量而不影响数据,而resize()开空间不仅会影响容量还会影响数据。

🍍查看空间容量

capacity(), size()

string str1("hello world");
str1.reserve(100);
string str2("hello world");
str2.size(100);

在这里插入图片描述
capacity()会计算空间的大小,而不去管有效数据的数量。
size()只会计算有限数据的个数。

🍑string增删查改

🍍增

string str("hello world");
str.push_back('a');//增加单个字符
str.append("abcd");//增加字符串
//这两者可以混合使用

str.insert(4, "pppp");//插入函数

在这里插入图片描述

string str1("hello world");
string str2("abcd");
str1 += "ppp";
str1 += 'a';
str1 += str2;

在这里插入图片描述
实际上述程序使用+=操作符是调用库里面operator+=()函数

🍍删

erase()

string str("hello world");
str.erase(2, 4);
//在str的第二个位置往后删除4个数据
//如果超过有效长度,则有多少就删掉多少。

在这里插入图片描述
从程序执行结果看,空格也占一行。

🍍找

find(),rfind()

string str("hello world");
int ret1 = str.find('e', 0);
int ret2 = str.find('p', 0);

在这里插入图片描述
找到就返回找到的个数,没找到就返回-1;

rfind()函数就和find()找的方向相反,find()是从左向右,而rfind()就是从右向左。

🍍改

replace()

string str("hello");
str.replace(4, 1, "abc");
//从str中第四个位置起后的第一个字符替换成"abc"
//不会压榨后面的空间,会临时扩大

在这里插入图片描述

关于本本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!

请添加图片描述
请添加图片描述