关于C++STL的总结(基础使用)

本文详细介绍了C++STL的核心组件,包括容器的分类(序列式和关联式)、迭代器的作用和类型、算法和仿函数的应用以及适配器和空间配置器的功能。后续还将探讨容器的底层实现原理。
摘要由CSDN通过智能技术生成

STL是什么?

STL即(Standard Template Library)标准模板库,提供了常见的数据结构和算法函数等,其下共包含六大组件:

  1. 容器
  2. 算法
  3. 迭代器
  4. 仿函数
  5. 适配器
  6. 空间配置器

本篇重点介绍容器的使用和简单的底层实现原理,其它的部分简略带过
六大组件互相的关系大致如下图:
在这里插入图片描述


容器

容器即是存储数据的类模板,本质即是封装了常用的数据结构,主要可以分为两类:

  • 序列式容器
    关联式容器将相同类型的元素以有序的方式线性组织起来,如下:
    1. vector:动态数组,支持快速的随机访问
    2. deque:双端队列,支持快速插入和删除
    3. list:双向循环链表,支持快速插入和删除,但不支持随机访问
  • 关联式容器
    1. set/multiset:集合/多重集合(key形式)
    2. map/multimap:映射/多重映射(key-value形式)
    3. unordered_set/unordered_multiset:无序集合/无序多重集合
      unordered_map/unordered_multimap:无序映射/无序多重映射(哈希表)

还有些常见的“容器”,如stack/queue和priority_queue,这些则是属于容器适配器的组件,它们是在基本容器(vector,deque等)之上提供特定接口的适配器


迭代器

什么是迭代器?迭代器本质就是用于遍历和操作容器中的元素的一种工具,它提供了访问容器元素的方法,可以简单理解为数组名(即指针)
为什么需要迭代器?迭代器最重要的意义是提供了一种统一的方式来操作容器中的元素,无需在意元素类型,底层数据结构实现细节,都通过迭代器来进行访问
迭代器的类型大致分为以下五种:

  1. 单向迭代器:仅支持++操作(forward_list)
  2. 双向迭代器:仅支持++和–操作(list)
  3. 随机访问迭代器:支持+和-的操作(deque、vector)
  4. 反向迭代器:即与正向迭代器相反的操作的迭代器
  5. 常量迭代器:不支持修改的迭代器

不同的迭代器只是性质不一样,但使用起来时都是相同的使用iterator进行操作,iterator底层的实现可能是指针,也可能是封装的其它数据结构,如list的迭代器封装的即是链表节点,无论封装的什么,都是为了统一访问元素的方式


算法、仿函数

算法和仿函数即是为了方便C++开发,提前写好的一些常用算法和“函数”,便于使用
算法常见的即sort,swap,max/min等,详情可以去看官方文档,重点说一下仿函数

  • 什么是仿函数?
    仿函数又被称为函数对象,本质是一个类,重载了函数调用运算符operator(),使得这个类的对象可以像函数一样被调用,故此又称仿函数

  • 常见的即自定义Compare比较类,实例如下(实际中可以提供更多样不同的类型的比较)

    class Compare {
    public:
        bool operator()(int num1, int num2) {
            return num1 < num2;
        }
    };
    
    int main() {
        Compare cmp;
        std::cout << cmp(1, 2) << std::endl;  
       	sort(v.begin(), v.end(), Compare());
    	sort(v.begin(), v.end(), greater<int>());
    	for(auto i : v){
    		cout << i << endl;
    	}
    	sort(v.begin(), v.end(), less<int>());
    	for(auto i : v){
    		cout << i << endl;
    	}
        return 0;
    }
    
    
    

实例中的less和greater即是functional中为我们提供的仿函数类,一般都是用于sort等函数的函数比较器使用


适配器和空间配置器

适配器

在C++的STL中,适配器是一种设计模式,它的目的是使得原本接口不兼容的类可以一起工作。在STL中,适配器主要有三种类型:

  1. 容器适配器:容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能²。例如,stack是一个封装了deque容器的适配器类模板,默认实现的是一个后入先出(Last-In-First-Out,LIFO)的压入栈⁴。queuestack大同小异,只是开放的函数是符合先进先出(FIFO)原则的函数。

  2. 函数对象适配器:函数对象适配器可以将一般迭代器的赋值(assign)操作,转化为插入(insert)操作²。有专司头端插入的front_insert_iterator,专司尾部插入的back_insert_iterator,还有就是insert_iterator,其可以实现从任意位置执行插入操作。

  3. 迭代器适配器:迭代器适配器可以将迭代器绑定到一个stream(数据流)对象身上。绑定到istream对象(例如std::cin)者,称为istream_iterator,拥有输入能力;绑定到ostream对象(例如std::cout)者,称为ostream_iterator,拥有输出能力。


空间配置器

C++的STL中的空间配置器是一个非常重要的组件,它负责内存的配置和管理。空间配置器的存在可能平常并不太能感知到,但其为STL的操作对象提供了存储空间(内存池)。

什么是空间配置器?
空间配置器是一个实现了动态空间配置、空间管理、空间释放的class template。它的主要任务是为STL容器分配和释放内存。

为什么需要空间配置器?
空间配置器的存在可以帮助我们更有效地管理内存。它可以解决小块内存频繁申请释放带来的性能问题,以及小块内存带来的内存碎片问题。

空间配置器是如何工作的?
STL的空间配置器有两级:第一级配置器和第二级配置器。

  1. 第一级配置器:当配置区块大于128bytes时,将其视作足够大,直接使用malloc和free。

  2. 第二级配置器:当配置区块小于128bytes时,将其视作过小,为降低额外负担,采用内存池的管理方式。内存池的思想是一次向heap申请一块很大的内存,如果申请小块内存的话就直接到内存池中去要。

在STL中,空间配置器的基本操作包括:

  • 内存配置:由成员函数allocate()负责。
  • 内存释放:由成员函数deallocate()负责。
  • 对象构造:由成员函数construct()负责。
  • 对象析构:由成员函数destroy()负责。

关于容器的详解后续会补充STL各个常用的容器的模拟实现,以此了解其底层原理(待)

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
神书-STL实现原理,对于强化数据结构-算法的程序员必备、必读书籍。The Best-Selling Programmer Resource–Now Updated for C++11 The C++ standard library provides a set of common classes and interfaces that greatly extend the core C++ language. The library, however, is not self-explanatory. To make full use of its components - and to benefit from their power - you need a resource that does far more than list the classes and their functions. The C++ Standard Library - A Tutorial and Reference, 2nd Edition describes this library as now incorporated into the new ANSI/ISO C++ language standard (C++11). The book provides comprehensive documentation of each library component, including an introduction to its purpose and design; clearly written explanations of complex concepts; the practical programming details needed for effective use; traps and pitfalls; the exact signature and definition of the most important classes and functions; and numerous examples of working code. The book focuses on the Standard Template Library (STL), examining containers, iterators, function objects, and STL algorithms. You will also find detailed coverage of strings, concurrency, random numbers and distributions, special containers, numerical classes, internationalization, and the IOStreams library. An insightful introduction to fundamental concepts and an overview of the library will help bring newcomers quickly up to speed. A comprehensive index will support the C++ programmer in his/her day-to-day life.
### 回答1: 在网络编程中,C++STL(Standard Template Library)是一个非常有用的工具。STL提供了许多数据结构和算法,可以帮助我们更轻松地处理网络编程中的各种任务。 首先,STL的容器类是网络编程中经常用到的数据结构。例如,我们可以使用STL的vector来存储动态大小的数组,非常适用于存储和处理网络数据。此外,STL的map和unordered_map类可以用于构建键值对结构,方便快速地查找和操作网络数据。 STL还提供了一系列的算法,可以用于处理网络编程中的常见任务。例如,我们可以使用STL的sort算法对网络数据进行排序,使用STL的find算法查找某个特定的数据,或者使用STL的accumulate算法计算网络数据的总和。这些算法能够在网络编程中提高代码的效率和可读性。 此外,STL还提供了一些其他功能,如字符串处理和输入输出操作等,这些功能在网络编程中也非常有用。 总之,C++STL在网络编程中是一个强大且方便的工具。它提供了多种数据结构和算法,可以帮助我们更轻松地处理网络数据,并提高代码的效率和可读性。无论是处理数据、查找特定的值还是进行计算,STL都能够提供相应的功能,使网络编程变得更加简单和高效。 ### 回答2: C++ STL(标准模板库)是C++语言的一个重要部分,它提供了一系列的模板类和函数,用于实现常用的数据结构和算法。网络编程是指利用计算机网络进行数据传输和通信的一种编程方式。 在C++使用STL进行网络编程时,可以使用STL提供的一些容器类和算法来简化网络编程的过程。例如,使用vector可以方便地管理接收或发送的数据;使用algorithm库中的函数可以快速处理数据;使用string类可以方便地操作字符串等。 对于网络编程,C++ STL没有直接提供相应的网络编程接口,而是需要借助于操作系统提供的网络编程库(如Socket套接字编程)来实现网络通信。通过将底层的网络库和STL进行结合,可以更加方便和高效地编写网络应用程序。 在网络编程中,可以使用STL中的容器类来存储和管理从网络中接收到的数据,例如使用vector来存储接收到的数据包,或者使用list来保存已连接的客户端。同时,可以使用STL中的算法来处理这些数据,例如使用find函数查找数据包中的特定元素。 除此之外,STL还提供了一些有用的函数和类,例如thread类可以用于多线程编程,用于处理并发的网络请求;atomic类可以保证对共享数据的原子性操作,用于实现线程安全的网络通信。 总而言之,C++ STLC++编程中的重要工具,它提供了一系列的模板类和函数,可以方便地实现网络编程中的数据管理和算法处理,而网络编程则是利用计算机网络进行数据传输和通信的一种编程方式。 ### 回答3: C++ STL(Standard Template Library)是一组标准库,提供了许多常用的数据结构和算法。它包含的容器类(如vector、list、map等)可以方便地存储和操作数据,而提供的算法则可以实现一些常用的数据处理操作(如排序、查找等)。 在网络编程方面,C++ STL可以使用socket库(socket.h)来实现网络通信。通过socket库,可以创建网络套接字(socket),并使用套接字进行数据的收发。 C++ STL中的vector可以被用来存储接收和发送的数据,可以使用其成员函数push_back()向vector中添加数据,使用operator[]访问vector中的数据。使用vector的好处是可以动态调整容器大小,使得数据存储更加方便。 通过网络套接字的recv()函数可以接收网络中传来的数据,而send()函数可以将数据发送到网络中。需要注意的是,在使用recv()函数接收数据时,应该使用一个循环来确保接收到完整的数据。可以使用std::string和字符数组来存储接收和发送的数据。 除了基本的网络通信,C++ STL还提供了一些辅助函数,用于解析和构造网络地址。例如,使用inet_ntoa()函数可以将IP地址从网络字节顺序转换为字符串形式,而inet_aton()函数则可以将IP地址从字符串形式转换为网络字节顺序。 总而言之,C++ STL可以在网络编程中提供丰富的数据结构和算法,使开发者可以更加轻松地实现各种网络应用。使用网络套接字和STL提供的功能,可以实现数据的发送和接收,并对数据进行各种处理和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c.Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值