zoukankan      html  css  js  c++  java
  • 查漏补缺:C++STL简述(容器部分)

      STL:是Standard Template Library的简称,中文译为标准模板库,是由惠普实验室开发的一系列软件的统称,现为C++的一部分,可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)和仿函数(functors)六部分,本文只简单阐述容器部分。

      在C++标准中,STL被组织为下面的17个头文件:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>,容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。

      容器分两大类:

      一、顺序容器:元素在顺序容器中的顺序与其加入容器时的位置相对应。

      标准库中的所有顺序容器都提供了快速访问元素的能力,但这些容器在一下方面都有不同的性能折中:

        (1)向容器中添加或从容器中删除元素的代价

        (2)非顺序访问容器中元素的代价

      1、顺序容器类型

        (1)vector:可变大小数组,支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。

        (2)deque:双端队列。支持快速随机访问。在头尾位置插入或删除速度很快。

        (3)list:双向链表。只支持双向顺序访问。在list中任何位置进行插入或删除操作速度都很快。

        (4)forward_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入或删除操作速度都很快。

        (5)array:固定大小的数组。支持快速随机访问。不能添加或删除元素。

        (6)string:与vector相似的容器,但专门用于保存字符。随机访问快,在尾部插入或删除速度快。

      2、顺序容器的选择

        通常,vector是最好的选择,除非有很好的理由选择其他容器。一下是选择容器的基本原则:

        (1)除非有很好的理由选择其他容器,否则应使用vector。

        (2)如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或者forward_list。

        (3)如果程序要求随机访问元素,应使用vector或者deque。

        (4)如果程序要求在容器中间插入或删除元素,应使用list或forward_list。

        (5)如果程序要求在容器头尾位置插入或删除元素,但不会在中间位置插入或删除元素,则使用deque。

        (6)如果程序只有在读取输入时需要在容器中间位置插入元素,随后需要随机访问元素,则

          ----首先,确定是否真的需要在容器中间位置插入元素。当处理输入数据时,通常可以很容易的向vector中追加数据,然后再调用标准库中的sort函数来重排容器中的元素,从而避免在中间位置添加元素。

          ----如果必须在中间位置插入元素,考虑在输入阶段使用list,一旦输入结束,将list中的内容拷贝到一个vector中。

      

      二、关联容器:关联容器中的元素是按关键字来保存和访问的。关联容器支持高效的关键字查找和访问,主要的两个关联容器:map和set。

        map:其中的元素是一些关键字-值(key-value)对,关键字起到索引的作用,值表示与索引相关联的数据。

        set:每个元素只能包含一个关键字,支持高效的关键字查询操作----检查给定的关键字是否在set中。

        1、标准库中提供了8个关联容器。这8个容器的不同体现在三个维度上:

        (1)每个容器或是一个map,或是一个set

        (2)或要求不重复关键字,或要求重复关键字

        (3)按顺序保存,或者无序保存。

        按关键字有序保存的元素:

        map:关联数组;保存关键字-值

        set:关键字即值,即只保存关键字的容器

        multimap:关键字可重复的map

        multiset:关键字可重复的set

        无序集合:

        unordered_map:用哈希函数组织的map

        unordered_set:用哈希函数组织的set

        unordered_multimap:哈希组织的map,关键字可重复出现

        unordered_multiset:哈希组织的set,关键字可重复出现

  • 相关阅读:
    控制器之间的通信(传值方法)以及多次调用通信
    关于ios项目沙盒中的文件和Xcode项目创建的文件
    解决cell循环利用造成的重复勾选
    让TabelView视图中自定义的Toolbar固定(不随cell的移动而移动)
    jsonString转NSDictionary
    日期字符串转换 and 两个日期相减
    Java虚拟机 简介
    浅谈操作系统对内存的管理(转)
    Java虚拟机规范(Java SE 7)笔记
    StringUtils
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/7651919.html
Copyright © 2011-2022 走看看