<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【STL和泛型編程】3. set、map分析(及typename起源)

      前置知識(shí):紅黑樹原理 【數(shù)據(jù)結(jié)構(gòu)】7.平衡搜索樹(AVL樹和紅黑樹),紅黑樹的平衡性有利于 search 和 insert

      • 紅黑樹的迭代器
        • begin() 左側(cè)
        • end() 右側(cè)
        • 迭代順序 5 6 7 8 10 11 12 13 15
        • 不能使用迭代器修改 Key 的值,例如將 6 改成 50 會(huì)破壞紅黑樹的性質(zhì)

      1. RB-tree

        在g++編譯器中(4.9),rbtree在 <bits/stl_tree.h> 中定義

      // Key: key; Value: Key+Data; KeyOfValue: 從Value中取出Key 注意這里的Value是Key和Data結(jié)合起來傳入的類
      // Compare: 比較Key大小的函數(shù)
      template <class Key, class Value, class KeyOfValue, class Compare, class Allocated = alloc>
      class _Rb_tree {
      protected:
          typedef __rb_tree_node<Value> rb_tree_node;
      public:
          typedef rb_tree_node* link_type;
      protected:
          size_type node_count;    // 節(jié)點(diǎn)元素個(gè)數(shù)
          link_type header;        // 頭節(jié)點(diǎn)指針,包括了Value, left, right, parent
          Compare key_compare;    // key的大小比較函數(shù)
      };
      • 使用案例,該rbtree的key就是value,獲取key的方式就是直接返回該元素
        • rbtree._M_insert_unique(5);  插入元素(無重復(fù))
        • rbtree._M_insert_equal(5); 插入元素(可以重復(fù)),可以使用 .count(5) 計(jì)算數(shù)量
      _Rb_tree<int, int, identity<int>, less<int>, alloc> rbtree;
      
      // identity 類重載了括號(hào),直接返回該元素本身
      template <class T>
      struct identity : public unary_function<T, T> {
          const T& operator()(const T& x) const { return x; }
      };
      
      // less 重載了括號(hào),比較大小后返回元素
      template <class T>
      struct less : public binary_function<T, T, bool> {
          bool operator()(const T& x, const T& y) const
          { return x<y; }
      };

      2. set / multiset

      • set 提供遍歷操作以及迭代器 iterator,可以使用 ++ite 進(jìn)行遍歷,并且得到排序后的數(shù)據(jù)
      • 無法使用迭代器修改元素值,修改值會(huì)導(dǎo)致破壞排序
      • set insert 調(diào)用無重復(fù)插入方法,multiset insert 調(diào)用可重復(fù)插入的方法
      template <class Key, class Compare = less<Key>, class Alloc = alloc>
      class set {
      public:
          typedef Key key_type;
          typedef Key value_type;
          typedef Compare key_compare;
          typedef Compare value_compare;
      prevate:
          typedef rb_tree<key_type, value_type, identity<value_type>, key_compare, Alloc> rep_type;
          rep_type t;    // 實(shí)際存儲(chǔ)內(nèi)容的紅黑樹
      public:
          typedef typename rep_type::const_iterator iterator;    // 從set拿迭代器拿到的是 const_iterator,避免使用者使用迭代器修改元素
          // ...
      };

       2.1 typename

      typedef typename rep_type::const_iterator iterator; // STL源碼的寫法
      typedef rep_type::const_iterator iterator; // 這樣存在什么問題?

        首先看類作用域下操作符 MyClass::name 調(diào)用實(shí)際上有 3 種可能:以MyClass為例子來說,MyClass::A靜態(tài)數(shù)據(jù)成員,MyClass::B靜態(tài)成員函數(shù),MyClass::C嵌套類型。由于MyClass是一個(gè)完整的定義,所以編譯器完全可以推斷出任意一個(gè)變量究竟是什么類型的。但還有一種可能,如果是T::name呢?

      class MyClass{
          static int A;    // 靜態(tài)變量A
          static int B();  // 靜態(tài)成員函數(shù)B
          typedef int C;   // 嵌套類型C
      }

        以foo函數(shù)為例子,一眼看下去它的含義是定義了T類中iterator的指針并起名為iter;如果傳入的是ContainsAType則完全沒有問題。但如果傳入的是ContainsAnotherType則會(huì)出現(xiàn)問題,因?yàn)樵谠擃愔卸x了靜態(tài)整形變量,如果有一個(gè)全局整形變量iter,則翻譯后這里就會(huì)變成一個(gè)乘法表達(dá)式,二義性是不能被允許的,所以委員會(huì)引入了typename關(guān)鍵字

        模板類型實(shí)例化前,并不知道它具體是哪個(gè)類型,而使用typename 可以直接告訴編譯器這是一個(gè)類型,而非成員對(duì)象。

      struct ContainsAType {
          struct iterator { /* ... */ }
      };
      
      struct ContainsAnotherType {
          static int iterator;
      };
      
      template <class T>
      void foo() {
          T::iterator * iter;
          // ...
      }

      3. map / multimap

      • map 提供遍歷操作以及迭代器 iterator,可以使用 ++ite 遍歷排序后的數(shù)據(jù)
      • 無法使用迭代器修改 key,但允許修改 data(源碼實(shí)現(xiàn)很巧妙,借用 pair<const Key, T> 實(shí)現(xiàn))
      • map insert 調(diào)用無重復(fù)插入方法,multimap insert 調(diào)用可重復(fù)插入方法
        • insert(pair<long, string>(1, "HelloWorld"); 插入時(shí)應(yīng)該插入一個(gè)pair
        • map[5] = "Hi Five";  // 插入 (5, "Hi Five")
        • map[5];  // 這個(gè)比較有趣,標(biāo)準(zhǔn)規(guī)定,如果沒有 Key 5, 則創(chuàng)建 Key 5 和 string 的默認(rèn)值
        • 在multimap 不可以使用 multimap[]進(jìn)行插入
      template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
      class map {
      public:
          typedef Key key_type;
          typedef T data_type;
          typedef T mapped_type;
          typedef pair<const Key, T> value_type;    // value 是 const Key 和 Data 的結(jié)合
          typedef Compare key_compare;
      prevate:
          typedef rb_tree<key_type, value_type, select1st<value_type>, key_compare, Alloc> rep_type;
          rep_type t;    // 實(shí)際存儲(chǔ)內(nèi)容的紅黑樹
      public:
          typedef typename rep_type::iterator iterator;    // 因?yàn)閜air中是const key, 從而實(shí)現(xiàn)只能修改value不能修改key
          // ...
      };

       

      posted @ 2024-02-29 09:56  cear  閱讀(33)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲人成人一区二区三区| 亚洲精品动漫免费二区| 国产av一区二区三区无码野战| 亚洲av一本二本三本| AV教师一区高清| 国产AV巨作丝袜秘书| 班戈县| 蜜臀在线播放一区在线播放 | 蜜臀av午夜精品福利| 开心五月激情五月俺亚洲| 国产成人8x视频一区二区| 国产精品麻豆中文字幕| 野花韩国高清电影| 中文字幕V亚洲日本在线电影| 疯狂的欧美乱大交| 亚洲人成日韩中文字幕不卡| 久爱www人成免费网站| 野外做受又硬又粗又大视频√ | 午夜在线欧美蜜桃| 国产极品尤物免费在线| 成人午夜激情在线观看| 精品一区二区久久久久久久网站| 黑人巨大av无码专区| 国产精品日韩中文字幕| 欧美高清freexxxx性| 亚洲69视频| 日本一区二区精品色超碰| 国产精品伦理一区二区三| 91国在线啪精品一区| 国产超高清麻豆精品传媒麻豆精品| 日韩人妻av一区二区三区| 精品偷拍被偷拍在线观看| 欧美日本激情| 五月天免费中文字幕av| 国产色精品久久人妻| 亚洲码亚洲码天堂码三区| 亚洲鸥美日韩精品久久| 色综合色综合久久综合频道88| 精品国产女同疯狂摩擦2| 在线看免费无码av天堂| a∨变态另类天堂无码专区|