网站开发例子,网络黄页推广软件下载,网站开发概要设计模板,千万不要报培训班学室内设计#x1f341;你好#xff0c;我是 RO-BERRY #x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 #x1f384;感谢你的陪伴与支持 #xff0c;故事既有了开头#xff0c;就要画上一个完美的句号#xff0c;让我们一起加油 目录 1. 什么是STL2. STL的版本… 你好我是 RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 感谢你的陪伴与支持 故事既有了开头就要画上一个完美的句号让我们一起加油 目录 1. 什么是STL2. STL的版本3. STL的六大组件4. STL的重要性5. 如何学习STL6.STL的缺陷7. 为什么学习string类8. 标准库中的string类8.1 string类(了解)8.2 string类的常用接口说明注意下面我只讲解最常用的接口8.3 string类对象的容量操作8.4 测试string容量相关的接口size、length和capacityclear接口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 SystemsInc公司开发继承自HP版 本。被GCC(Linux)采用可移植性好可公开、修改甚至贩卖从命名风格和编程 风格上看阅读性非常高。我们后面学习STL要阅读部分源代码主要参考的就是这个版本。
3. STL的六大组件 4. STL的重要性
STLStandard Template Library是C标准库中的一个重要组成部分它提供了一系列的通用模板类和函数用于实现常用的数据结构和算法。STL的重要性主要体现在以下几个方面 提高开发效率STL提供了丰富的容器如vector、list、map等和算法如排序、查找、遍历等可以直接使用这些现成的模板避免了手动实现这些功能的繁琐过程大大提高了开发效率。 提供高性能的数据结构和算法STL中的容器和算法都经过精心设计和优化具有高效的性能。例如vector提供了快速的随机访问和动态扩容的能力而算法库中的排序和查找算法采用了高效的实现方式可以在大规模数据处理中获得较好的性能。 代码可重用性STL中的容器和算法都是通用的可以适用于各种类型的数据。通过使用STL我们可以编写出更加通用、可复用的代码提高代码的可维护性和可扩展性。 标准化和规范化STL是C标准库的一部分它定义了一套统一的接口和规范使得不同的开发者可以使用相同的方式来操作数据结构和算法。这样可以提高代码的可读性和可理解性方便代码的交流和共享。 丰富的功能和灵活性STL提供了多种容器和算法的选择可以根据具体的需求选择合适的容器和算法。同时STL还支持自定义类型的容器和算法可以根据实际情况进行扩展和定制。 在工作中 网上有句话说“不懂STL不要说你会C”。STL是C中的优秀作品有了它的陪伴许多底层的数据结构以及算法都不需要自己重新造轮子站在前人的肩膀上健步如飞的快速开发。 5. 如何学习STL 学习STLStandard 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库的更新太慢了。这个得严重吐槽上一版靠谱是C98中间的C03基本一些修订。C11出 来已经相隔了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_stringchar, char_traits, allocator 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个字符cstring(const strings) 重点拷贝构造函数
这里重点示范三个重点的string构造
#includeiostream
using namespace std;int main()
{string s1; // 构造空的string类对象s1string s2(hello world); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3cout s1 endl;cout s2 endl;cout s3 endl;return 0;
}运行结果 8.3 string类对象的容量操作
函数名称功能说明size重点返回字符串有效字符长度length返回字符串有效字符长度capacity返回空间总大小empty 重点检测字符串释放为空串是返回true否则返回falseclear 重点清空有效字符reserve 重点为字符串预留空间resize 重点将有效字符的个数该成n个多出的空间用字符c填充
8.4 测试string容量相关的接口
size、length和capacity size和length都可以输出string容器中存储的字符串长度 capacity—string容器的容量 int main()
{// 注意string类对象支持直接用cin和cout进行输入和输出string s(hello, world!!!);cout s.size() endl;cout s.length() endl;cout s.capacity() endl;cout s endl;
}clear接口
将s中的字符串清空注意清空时只是将size清0不改变底层空间的大小
int main()
{string s(hello, world!!!);s.clear();cout s.size() endl;cout s.capacity() endl;
}resize接口 list容器的resize()函数用于改变容器的大小。它接受一个参数该参数表示容器的新大小。 当新大小小于当前大小时resize()函数会删除多余的元素使容器的大小等于新大小。 当新大小大于当前大小时resize()函数会在容器末尾添加默认构造的元素直到容器的大小等于新大小。
将s中有效字符个数增加到10个多出位置用’a’进行填充
int main()
{string s(hello);s.resize(10, a);cout s.size() endl;cout s.capacity() endl;cout s endl;
}将s中有效字符个数增加到15个多出位置用缺省值’\0’进行填充
int main()
{string s(hello);s.resize(15);cout s.size() endl;cout s.capacity() endl;cout s endl;
}将s中有效字符个数缩小到5个
int main()
{string s(hello world);s.resize(5);cout s.size() endl;cout s.capacity() endl;cout s endl;
}reserve接口 reserve()是list容器的一个成员函数用于预留一定的内存空间以提高插入元素的效率。 reserve()函数的作用是为list容器预留一定数量的元素空间但并不实际创建这些元素。它可以在插入大量元素之前使用以避免频繁的内存重新分配和复制操作从而提高性能。 使用reserve()函数的语法如下 void reserve(size_type n); 其中n表示要预留的元素数量。 注意 :reserve()函数只会增加容器的容量并不会改变容器的大小。如果在调用reserve()之后插入的元素数量超过了预留的空间容器会自动进行内存重新分配。
int main()
{string s;cout s.size() endl;cout s.capacity() endl;// 测试reserve是否会改变string中有效元素个数s.reserve(100);cout s.size() endl;cout s.capacity() endl;// 测试reserve参数小于string的底层空间大小时是否会将空间缩小s.reserve(50);cout s.size() endl;cout s.capacity() endl;
}empty接口
检测字符串释放为空串是返回true否则返回false
int main()
{string s;int i s.empty();cout i endl;s abcd;i s.empty();cout i endl;return 0;
}注意
size()与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()。clear()只是将string中有效字符清空不改变底层空间大小。resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用0来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间。注意resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变。reserve(size_t res_arg0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小。
8.5 string类对象的访问及遍历操作
函数名称功能说明operator[] 重点返回pos位置的字符const string类对象调用begin endbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭代器rbegin rendbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭代器范围forC11支持更简洁的范围for的新遍历方式 注意 string遍历时使用最多的还是for下标 或者 范围for(C11后才支持) void Teststring4()
{string s(hello Bit);// 3种遍历方式// 需要注意的以下三种方式除了遍历string对象还可以遍历是修改string中的字符// 另外以下三种方式对于string而言第一种使用最多// 1. foroperator[]for (size_t i 0; i s.size(); i)cout s[i] endl;//等价于 cout s.operator[i] endl;// 2.迭代器string::iterator it s.begin();while (it ! s.end()){cout *it endl;it;}// string::reverse_iterator rit s.rbegin();// C11之后直接使用auto定义迭代器让编译器推到迭代器的类型auto rit s.rbegin();while (rit ! s.rend())cout *rit endl;// 3.范围forfor (auto ch : s)cout ch endl;
}我们最推荐使用的是迭代器其重要作用会在后续章节体现
反向迭代器
我们有正向的迭代器还有反向的 rbegin rend 我们可以使用rbegin和rend进行反向输出 int main()
{string s(hello world);string::reverse_iterator it s.rbegin();while (it ! s.rend()){cout *it ;it;}cout endl;return 0;
}const迭代器 const迭代器是一种用于遍历容器中元素的迭代器它的作用是限制对容器中元素的修改操作。通过使用const迭代器我们可以确保在遍历容器时不会意外地修改容器中的元素。 const迭代器有以下几个特点
只能读取容器中的元素不能修改它们。可以与普通迭代器进行区分以便在编程中进行类型检查和约束。可以用于遍历常量容器例如const vector、const list等。
对const对象使用迭代器的时候也需要用const迭代器这是针对const对象特定的迭代器
int main()
{const string s(hello world);string::const_reverse_iterator it s.rbegin();while (it ! s.rend()){cout *it ;it;}cout endl;return 0;
}对于正向的迭代器用法是一样的