• STL 容器 与 数据结构


    一.序列式容器(各元素之间是线性关系,vector, deque,list):迭代器类型,随机访问迭代器(list是双向访问迭代器,不支持随机访问)。

     1.vector,向量

    相当于动态数组,当程序员不知道需要的数组多大时,用其来解决问题来达到最大节约空间。

    在不需要扩容的情况下,它的操作时间复杂度和数组一样。

    vector占用的内存是只增不减的,它的erase和clear函数只删除元素,不回收空间,只在vector析构时回收空间。

    也有insert函数,可在任意下标位置插入、删除(但不在尾部插入的话会导致指向vector的iterator、pointer,reference失效)。

    2.deque,双向队列

    逻辑结构:首尾都开放的动态数组

    内部结构:多个连续的内存块,在一个映射结构中保存他们的地址和顺序

    insert函数,可在任意下标位置插入、删除(但不在首尾部插入的话会导致指向vector的iterator、pointer,reference失效)。

    不同于vector,当deque的内存不再被使用时,会自动释放。

    3.list,双向链表

    list每个节点都保存了信息块(元素值)、前驱指针、后驱指针,因此占用空间更大。

    list由于是链表形式,在任意位置插入和删除效率都很高O(1),但对元素的访问复杂度O(n)。

    二.关联式容器(元素按key值有序插入:set,multiset,map,multimap,都是由红黑树实现)

    红黑树查找、插入、删除操作的时间复杂度是O(lgn)。采用插入方式生成一棵红黑树的时间复杂度是O(nlgn),而遍历红黑树的时间复杂度是O(n)。

    迭代器类型:双向迭代器。

    三.容器适配器(具有某种特殊功能的容器变种,不提供迭代器:stack、queue、priority_queue)

    他们和容器的构造不同在于他们有一个参数class container,而容器有一个参数allocator

    //vector
    template<
        class T,
        class Allocator = std::allocator<T>
    > class vector;
    //stack
    template<
        class T,
        class Container = std::deque<T> 
    > class stack;   

    首先了解一下priority_queue的定义:

    template<
        class T,
        class Container = std::vector<T>,
        class Compare = std::less<typename Container::value_type>
    > class priority_queue;

    priority_queue的一般性构造函数

    template<InputIt>
    priority_queue(InputIn first,InputIn last,
                           const Compare& compare, const Container& cont);  
    //初始化例子
    priority_queue<pair<string,int>,vector<pair<string,int>>,WordFreCompare >  wordQue(wordMap.begin(),wordMap.end());     

    priority_queue默认比较符号 < ,它只保证队首top()是最大的元素,内部不一定有序。

    四.unorder_map(hash表):内部是无序的,只与key相关(所以在使用自定义类型时,map要定义 < ,unorder_map要定义==)

    还有4种散列(hash)关联容器(hash_set,hash_multiset,hash_map,hash_multimap):如果没有冲突,散列表的查找、存取时间复杂度是O(1),但一般冲突是不可避免的,所以时间复杂度不确定。

    (hash表的桶一般是数组,计算出来的hash值一般是整数,可直接作为下标访问。)

    unorder_map定义:

    template<
        class Key,
        class T,
        class Hash = std::hash<Key>,
        class KeyEqual = std::equal_to<Key>,
        class Allocator = std::allocator< std::pair<const Key, T> >
    > class unordered_map;
  • 相关阅读:
    elastic search-php 多关键词查询实践(名称,日期,省份)
    记一次thinkphp 配置主从域名网站单点登录,退出
    thinkphp6 解决登录session跨域
    php富文本图片传递 通用css更改
    ELASTIC-PHP + IK分词器 + THINKPHP6 初次使用 (关键词查询)
    think-queue 加 redis实现批量导入excel
    百度api根据ip获取省市区
    php使用GD库将图片圆角 解决背景变黑问题 以及 图片丢失问题
    在树莓派上实现截图
    Arduino入门实践(五)--1、关于lcd的成像原理
  • 原文地址:https://www.cnblogs.com/wukuaiqian/p/7768850.html
Copyright © 2020-2023  润新知