✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
🍋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的版本
- 原始版本(HP 版本):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要阅读部分源代码,主要参考的就是这个版本。
🍍STL的六大组件
- 容器:容器是STL中最重要的组件之一,它提供了各种数据结构,如vector、list、deque、set、map等。这些容器用于存储和管理数据,并提供了对数据的基本操作。
- 算法:STL包含了一系列算法,用于对容器中的数据进行各种操作,如排序、搜索、复制、删除等。这些算法以函数模板的形式实现,可以与容器和迭代器一起使用,实现灵活且高效的数据处理。
- 迭代器:迭代器是STL中用于遍历容器元素的工具。它们提供了一种抽象化的方式,使得程序员可以像操作指针一样操作容器中的元素。迭代器在算法和容器之间起到了桥梁的作用,使得算法可以无缝地应用于各种容器。
- 仿函数:仿函数也被称为函数对象,其行为类似于函数,但实际上是重载了operator()的class或class template。它们可以作为算法的某种策略,用于定制算法的行为。
- 适配器:适配器是一种修饰容器、仿函数或迭代器接口的工具。它们可以改变容器、仿函数或迭代器的行为,使其适应不同的使用场景。例如,STL中的queue和stack就是使用deque作为底层容器实现的适配器。
- 配接器:配接器主要用于管理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"
//不会压榨后面的空间,会临时扩大
关于本本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!