zoukankan      html  css  js  c++  java
  • C++STL容器简析

    标准STL序列容器:vector、string、deque和list。

    标准STL关联容器:set、multiset、map和multimap。

    非标准的关联容器:hash_set、hase_multiset、hash_map和hash_multimap。

    容器适配器:stack、queue、priority_queue。

     以下简述几种常见容器:

    1 vector 容器

      vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array。vector基于模板实现,需包含头文件<vector>。

    (1)定义和初始化

      vector<int> vec1;                 //默认初始化,vec1为空

      vector<int> vec2(vec1);             //使用vec1初始化vec2

      vector<int> vec3(vec1.begin(),vec1.end());  //使用vec1初始化vec2

      vector<int> vec4(10);                //10个值初始化的元素

      vector<int> vec5(10,4);             //10个值为4的元素

    (2)常用操作方法

      vec1.push_back(t);                //vec1末尾添加元素t

      vec1.pop_back();                                         //删除末尾元素

      unsigned int size = vec1.size();         //元素个数

      bool isEmpty = vec1.empty();           //判断是否为空

      vec1.clear();                  //清空元素

      vec1.insert(vec1.end(),5,3);                          //从vec1.back位置插入个值为的元素

      vec1.erase(vec1.begin(),vec1.end());      //删除之间的元素,其他元素前移  

    (3)迭代器

      vector<int>::const_iterator iter = vec1.begin();


    注:vector动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。

    2 list 容器

      List是stl实现的双向链表,而且是一个环状双向链表,与 向量(vectors)相比, 它允许快速的插入和删除就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,但是随机访问却比较慢。需要添加头文件<list>。

    (1)定义和初始化

      list<int> lst1;                //创建空list

      list<int> lst2(3);               //创建含有3个元素的list

      list<int> lst3(3,2);              //创建含有3个2元素的list

      list<int> lst4(lst2);             //使用lst2初始化lst4

      list<int> lst5(lst2.begin(),lst2.end());     //同lst4 

    (2)常用操作方法

      lst1.assign(lst2.begin(),lst2.end());     //分配值

      lst1.push_back(10);             //lst末尾添加值

      unsigned int size = lst1.size();       //含有元素个数

      lst1.pop_back();              //删除末尾值

      bool isEmpty1 = lst1.empty();       //判断为空

      lst1.clear();                 //清空值

      lst1.front();                 //返回第一个元素的引用

      lst1.back();                   //返回最后一个元素的引用

      lst1.insert(lst1.begin(),3,2);        //从指定位置插入个

      lst1.erase(lst1.begin(),lst1.end());       //删除元素

      lst1.rbegin();                 //返回第一个元素的前向指针

      lst1.remove(2);               //相同的元素全部删除

      lst1.reverse();               //反转

      lst1.merge(lst2);             //合并两个list对象

      lst1.splice();               //合并两个list对象

      lst1.sort();                  //排序

      lst1.unique();               //删除相邻重复元素

     

    (3)迭代器

      list<int>::const_iterator iter = lst1.begin();

    3 deque 容器

      deque 是一种双向开口的连续线性空间,可以在队尾两端分别做元素的插入和删除操作。deque和vector的最大差异,一在于deque允许于常数时间内对起头端进行元素的插入或移除操作,push_front(),二在于deque没有所谓容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接在一起。换句话说,像vector那样"因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间"这样的事情在 deque是不会发生的。

      deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。其余类似vector操作方法的使用。需要添加头文件<deque>。

    成员函数: push_front(),push_back(),pop_front(),pop_back(),size(),empty(),insert(),erase(),clear(),swap()。

    迭代器:deque<int>::const_iterator iter = deq1.begin();

        deque<int>::const_reverse_iterator iter = deq1.rbegin();

    4 stack 容器

      stack 是一种先进后出(First In Last Out , FILO)的数据结构。它只有一个出口,stack 允许新增元素,移除元素,取得最顶端元素。但除了最顶端外,没有任何其它方法可以存取stack的其它元素,stack不允许遍历行为。需要添加头文件<stack>。

    成员函数:push(),top(),pop(),size(),empty(),getallocator()。不属于容器,只是容器适配器,不支持迭代器。

    5 queue 容器

      queue是一种先进先出(First In First Out,FIFO) 的数据结构。它有两个出口,queue允许新增元素,移除元素,从最底端加入元素,取得最顶端元素。但除了最底端可以加入,最顶端可以取出外,没有任何其它方法可以存取queue的其它元素。需要添加头文件<queue>。

    成员函数:front(),back(),push_back(),pop_front(),size(),empty()。不属于容器,只是容器适配器,不支持迭代器。

    6 priority_queue 容器

      priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其它存取元素的途径。priority_queue带有权值观念,其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面。需要添加头文件<queue>。

    注:heap并不归属于STL容器组件,它是个幕后英雄,扮演priority queue的助手。priority queue允许用户以任何次序将任何元素推入容器中,但取出时一定按从优先权最高的元素开始取。按照元素的排列方式,heap可分为max-heap和min-heap两种,前者每个节点的键值(key)都大于或等于其子节点键值,后者的每个节点键值(key)都小于或等于其子节点键值。因此, max-heap的最大值在根节点,并总是位于底层array或vector的起头处;min-heap的最小值在根节点,亦总是位于底层array或vector起头处。STL 供应的是max-heap,用c++实现。

    7 set 容器

      set的特性是,所有元素都会根据元素的键值自动被排序。集合数据既充当存储元素又充当简码,不允许两个元素有相同的值。set是通过红黑树来实现的,由于红黑树(RB-tree)是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL的set即以RB-Tree为底层机制。又由于set所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的set操作行为,都只有转调用RB-tree的操作行为而已。需要添加头文件<set>。

    成员函数:size(),max_size(),empty(),count(),find(),low_bound(),upper_bound(),equal_range(),insert(),erase(),clear(),swap()。

    迭代器:set<int>::const_iterator iter = st1.begin();

        set<int>::const_reverse_iterator iter = st1.rbegin();

    8 multiset 容器

      multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()。需要添加头文件<set>。

    9 map 容器

      map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。 pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值.由于RB-tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL map即以RB-tree为底层机制。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只是转调RB-tree的操作行为。对于迭代器来说,可以修改实值,而不能修改key,Map会根据key自动排序。需要添加头文件<map>。

    (1)定义和初始化

      map<int,string> map1;                            //空map

    (2)常用操作方法

      map1[3] = "Saniya";                               //添加元素     

      map1.insert(map<int,string>::value_type(2,"Diyabi"));  //插入元素

      map1.insert(make_pair<int,string>(4,"V5"));      //插入元素  

      string str = map1[3];                               //根据key取得value,key不能修改

      int key = iter_map->first;                        //取得eky

      string value = iter_map->second;                //取得value

      map1.erase(iter_map);                             //删除迭代器数据

      map1.erase(3);                                      //根据key删除value

      map1.size();                                     //元素个数  

      map1.empty();                                     //判断是否为空map  

      map1.clear();                                     //清空所有元素

    (3)迭代器

      map<int,string>::const_iterator iter = map1.begin();

      map<int,string>::const_reverse_iterator iter = map1.rbegin();

    10 multimap 容器

      multimap的特性以及用法与map完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique。需要添加头文件<map>。

    “If you give someone a program, you will frustrate them for a day; if you teach them how to program, you will frustrate them for a lifetime.”
  • 相关阅读:
    ————————————————————————————————————————————2002--------------------------------------------————————————————————
    windows accounts
    packages managers
    1.1 VGA(图像显示卡),Graphics Card(图形加速卡),Video Card(视频加速卡),3D Accelerator Card 和 GPU(图形处理器)
    Gartner提出的7种多租户模型
    MICRO-SERVICE
    etcd
    海量存储的一致性和高可用
    saml,sso
    proxy,https,git,tortoise git,ssh-agent,ssh-add,ssh,ssl,rsync
  • 原文地址:https://www.cnblogs.com/Scorpio989/p/4328360.html
Copyright © 2011-2022 走看看