zoukankan      html  css  js  c++  java
  • STL--STL和她的小伙伴们:

    STL--概述:
      标准模板库(StandardTemplateLibrary,STL),是C++程序设计语言标准模板库。STL是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽然它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
    STL是所有C++编译器和所有操作系统平台都支持的一种库,包含了很多在计算机科学领域里所常用的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应用框架,高度体现了软件的可复用性。
      对所有的编译器来说,提供给C++程序设计者的接口都是一样的。也就是说同一段STL代码在不同编译器和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的,使用者并不需要了解它的底层实现。
    使用STL的应用程序保证得到的实现在处理速度和内存利用方面都是高效的,因为STL设计者们已经考虑好了。
    使用STL编写的代码更容易修改和阅读。因为代码更短,很多基础工作代码已经被组件化了;使用简单,虽然内部实现很复杂。
      STL是建立在模板函数和模板类基础之上的功能强大的库。
      模板函数可以实现一般化的常用算法(如统计、排序、查找等)
      模板类可以实现支持几乎所有类型的容器,用来实现常用的数据结构(如链表、栈、队列、平衡二叉树等)
                                  STL 头文件一览表:
     

    头文件

    内容

    头文件

    内容

    <iterator>

    迭代器

    <vector>

    向量

    <utility>

    辅助功能

    <deque>

    双头队列

    <memory>

    内存管理

    <list>

    链表

    <algorithm>

    算法

    <set>

    集合与多重集合

    <functional>

    函数对象

    <map>

    映射与多重映射

    <numeric>

    数值运算

    <stack>

       

    <queue>

    队列与优先队列

     
     
     
    迭代器的定义和种类:
    n迭代器(iterator)实际上是一种一般化的指针类型,是对指针类型的抽象。
    n根据所支持操作的不同,迭代器被分为五大类:
    ¨输出迭代器(input iterator)
    ¨输入迭代器(output iterator)
    ¨前向迭代器(forward iterator)
    ¨双向迭代器(bidirectional iterator)
    ¨随机迭代器(random access iterator)
     
                                                                                            各种迭代器的功能

    迭代器类型

    输出迭代器

    输入迭代器

    前向迭代器

    双向迭代器

    随机迭代器

    缩写

    Out

    In

    For

    Bi

    Ran

    读取

    不支持

    x =   *p

    x =   *p

    x =   *p

    x =   *p

    操作

    不支持

    p->x

    p->x

    p->x

    p->x   p[i]

    写入

    *p   = x

    不支持

    *p   = x

    *p   = x

    *p   = x

    迭代

    ++

    ++

    ++

    ++   --

    ++   -- + - += -=

    比较

    不支持

    ==   !=

    ==   !=

    ==   !=

    ==   != < > <= >=

     
     
    更多关于迭代器的信息:
    指针类型就是一种特殊的随机迭代器类型。
    对于一般的迭代器,这些功能都是通过操作符重载来实现的。
    各种迭代器类型之间的关系:
                                                                         输出迭代器
     随机迭代器---》双向迭代器---》向前迭代器---》
                                                                         输入迭代器
     
    迭代器的作用
    ¨访问元素
    ¨算法与容器之间的纽带
     
     
    与算法有关的知识:
     
    算法(algorithm)
    ¨每个算法都是一个或者一组模板函数,用来完成一项特定的操作。
    序列(sequence)
    ¨序列用两个迭代器来描述,表示一组连续的元素;其中,第一个迭代器指向序列中的第一个元素,第二个迭代器指向序列最后一个元素的后一个位置。
    函数对象(function object)
    ¨函数对象重载了函数调用操作符(operator ()),可以像普通函数一样被使用。
    谓词(predicate)
    ¨返回值类型为bool的函数对象
     
    常用函数对象:
    STL在头文件<functional>中提供了一些常用运算的函数对象。
     

    类名

    类型

    作用

    equal_to

    双目

    arg1   == arg2

    not_equal_to

    双目

    arg1   != arg2

    greater

    双目

    arg1   > arg2

    less

    双目

    arg1   < arg2

    greater_equal

    双目

    arg1   >= arg2

    less_equal

    双目

    arg1   <= arg2

    logical_and

    双目

    arg1   && arg2

    logical_or

    双目

    arg1   || arg2

    logical_not

    单目

    !arg

    plus

    双目

    arg1   + arg2

    minus

    双目

    arg1   - arg2

    multiplies

    双目

    arg1   * arg2

    divides

    双目

    arg1   / arg2

    modulus

    双目

    arg1   % arg2

    negate

    单目

    -arg

     
    STL算法一览:
    访问元素类
    ¨for_each(), transform()
    顺序查找类
    ¨find(), find_if(), find_first_of(), adjacent_find(), search(), find_end(), search_n()
    统计类
    ¨count(), count_if()
    比较类
    ¨mismatch(), equal(), lexicographical_compare()
    复制类
    ¨copy(), copy_backward()
    交换类
    ¨swap(), iter_swap(), swap_ranges()
    替换类
    ¨replace(), replace_if(), replace_copy(), replace_copy_if()
    填充发生类
    ¨fill(), fill_n(), generate(), generate_n()
    删除类
    ¨remove(), remove_if(), remove_copy(), remove_copy_if
    去重类
    ¨unique(), unique_copy()
    反转类
    ¨reverse(), reverse_copy()
    旋转类
    ¨rotate(), rotate_copy()
    随机打乱类
    ¨random_shuffle()
    排序类
    ¨sort(), stable_sort(), partial_sort(), partial_sort_copy(), nth_element()
    二分查找类
    ¨lower_bound(), upper_bound(), equal_range(), binary_search()
    合并类
    ¨merge(), inplace_merge()
    ¨partition(), stable_partition()
    集合运算类
    ¨includes(), set_union(), set_intersection(), set_difference(), set_symmetric_difference()
    堆操作类
    ¨make_heap(), push_heap(), pop_heap(), sort_heap()
    最大最小类
    ¨min(), max(), min_element(), max_element()
    排列类
    ¨next_permutation(), prev_permutation()
    数值运算类
    ¨accumulate(), inner_product(), partial_sum(), adjacent_difference()
     
                                                                                                常用STL容器
     

    名称

    描述

    所在头文件

    迭代器类型

    vector

    向量

    <vector>

    随机迭代器

    deque

    双头队列

    <deque>

    随机迭代器

    list

    链表

    <list>

    双向迭代器

    stack

    <stack>

    不提供迭代器

    queue

    队列

    <queue>

    不提供迭代器

    priority_queue

    优先队列

    <queue>

    不提供迭代器

    set

    集合

    <set>

    双向迭代器

    multiset

    多重集合

    <set>

    双向迭代器

    map

    映射

    <map>

    双向迭代器

    multimap

    多重映射

    <map>

    双向迭代器

     
    一般容器:
      vector            deque                list
     
    容器适配器:
      栈stack
      队列queue
      优先队列priority_queue
    关联容器:
     
    元素有序
    用平衡二叉树实现
    类名:set, multiset, map, multimap
    分类
    ¨按元素构成来分
    集合:元素本身就是关键字,直接参与排序
    映射:元素由关键字和被映射的值构成,只有关键字参与排序
    ¨按关键字能否重复来分
    普通:关键字不能重复
    多重:关键字允许重复
     
     
    关联容器的特殊成员函数:
     
    查找类
    ¨find()
    ¨lower_bound()
    ¨upper_bound()
    ¨equal_range()
    复合类
    ¨operator []()
     
    STL的优缺点:
    优点:
    ¨降低编程复杂度
    ¨提高代码的正确率
    缺点:
    ¨编译时会出各种错误
    ¨给动态调试增加难度
     
    给几条建议吧:
    多用STL的算法
    优先使用内置数组
    多用静态查错
    动态查错时向屏幕输出
     
    小节:
    STL以面向对象的程序设计和一般化编程为基础,提供了功能强大的算法和容器,并通过迭代器把这两部分有机地结合起来
    haha
  • 相关阅读:
    HAProxy、Keepalived 在 Ocatvia 的应用实现与分析
    Octavia 的 HTTPS 与自建、签发 CA 证书
    Octavia 创建 loadbalancer 的实现与分析
    OpenStack Rally 质量评估与自动化测试利器
    自建 CA 中心并签发 CA 证书
    Failed building wheel for netifaces
    通过 vSphere WS API 获取 vCenter Datastore Provisioned Space 置备空间
    OpenStack Placement Project
    我们建了一个 Golang 硬核技术交流群(内含视频福利)
    没有图形界面的软件有什么用?
  • 原文地址:https://www.cnblogs.com/acm1314/p/4540576.html
Copyright © 2011-2022 走看看