• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            STL算法學習

            STL算法學習,小結如下:

            前提:

            下載stl源碼: ?http://www.sgi.com/tech/stl/download.html
            打開網頁:???? http://www.sgi.com/tech/stl/stl_index.html

            一?? 函數對象: 因為很多的算法中多使用了函數對象


            二元函數對象,V1和V2為輸入,V3為結果

            plus<T>:
            ? transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),plus<double>());

            其他的二元函數對象:minus,multiples,divieds,modulus.

            二元斷言函數對象,使用時需要bind2nd()或bind1st()來綁定比較對象。

            less<T>:
            ? find_if(L.begin(), L.end(), bind2nd(less<int>(), 0));

            其他的二元斷言函數:equal_to,notequal_to,greater,greater_equal,less_equal,logical_and,logical_or

            二元邏輯函數

            binary_negate:
            const char* wptr = find_if(str, str + MAXLEN,
            ?????????????????????????? compose2(not2(logical_or<bool>()),
            ??????????????????????????????????? bind2nd(equal_to<char>(), ' '),
            ??????????????????????????????????? bind2nd(equal_to<char>(), '\n')));

            一元函數對象

            negate:
            transform(V1.begin(), V1.end(), V2.begin(),
            ????????? negate<int>());

            一元斷定函數對象

            logical_not:
            ? transform(V.begin(), V.end(), V.begin(), logical_not<bool>());

            一元邏輯函數

            unary_negate:


            二?? 函數對象發生器:主要用來填充序列。


            產生不重復的隨機數:
            // Generate unique random numbers from 0 to mod:
            class URandGen {
            ? std::set<int> used;
            ? int limit;
            public:
            ? URandGen(int lim) : limit(lim) {
            ??? srand(time(0));
            ? }
            ? int operator()() {
            ??? while(true) {
            ????? int i = int(rand()) % limit;
            ????? if(used.find(i) == used.end()) {
            ??????? used.insert(i);
            ??????? return i;
            ????? }
            ??? }
            ? }
            };

            const int sz = 10;
            const int max = 50;
            vector<int> x(sz), y(sz), r(sz);
            //An integer random number generator:
            URandGen urg(max);
            generate_n(x.begin(), sz, urg);

            三 函數對象適配器 : 將函數轉化為函數對象

            ptr_fun:一般函數適配器

            一元實例:
            transform(first, last, first,
            ????????? compose1(negate<double>, ptr_fun(fabs)));

            二元實例:
            list<char*>::iterator item =
            ????????????? find_if(L.begin(), L.end(),
            ????????????????????? not1(binder2nd(ptr_fun(strcmp), "OK")));

            not1:對一元的斷定函數對象取反的適配器。

            not2: 對二元的斷定函數對象取反的適配器。

            mem_fun與mem_fun_ref:類成員函數的適配器,區別是一個需要指針,而另一個僅需要一般對象。如下:
            shape是一個指針變量,則foreach(v.begin(),v.end(),mem_fun(&shape::draw));
            但如果shape是一般的變量,不是指針,則foreach(v.begin(),v.end(),mem_fun_ref(&shape::draw));

            四?? 算法:

            拷貝:
            copy()
            reverse_copy()
            rotate_copy()
            remove_copy()? 拷貝不等于某值的元素到另一個序列。
            remove_copy_if() 拷貝符合條件的到另一個序列。

            填充和生成:
            fill()
            fill_n() 填充序列中的n個元素。
            generate()為序列中的每個元素調用gen()函數。

            排列:
            next_permuttion() 后一個排列。
            prev_permutation()

            partition() 劃分,將滿足條件的元素移動到序列的前面。
            stable_partition()

            查找和替換:
            find()
            binary_search() 在一個已經有順序的序列上查找。
            find_if()
            search() 檢查第二個序列是否在第一個序列中出現,且順序相同。

            刪除:注意必須調用erase()來真正刪除
            remove()
            unique()刪除相鄰重復元素,最好現排序。

            合并序列:
            merge()

            數值算法:
            accumulate() 對序列的每個元素進行運算后求和。
            transform() 也可以對每個元素進行運算。
            計數:
            size()總個數。
            count()等于某值的元素個數。

            adjacent_difference 序列中的后一個減前與他相鄰的前一個得到新的序列。

            adiacent_find

            五?? 所有的算法:

            ???? accumlate iterator 對標志的序列中的元素之和,加到一個由 init 指定的初始值上。重載的版本不再做加法,而是傳進來的二元操作符被應用到元素上。
            adjacent_different
            :創建一個新序列,該序列的每個新值都代表了當前元素與上一個元素的差。重載版本用指定的二元操作計算相鄰元素的差。
            adjacent_find
            :在 iterator 對標志的元素范圍內,查找一對相鄰的重復元素,如果找到返回一個 ForwardIterator ,指向這對元素的第一個元素。否則返回 last 。重載版本使用輸入的二元操作符代替相等的判斷。
            binary_search
            :在有序序列中查找 value ,如果找到返回 true 。重載的版本使用指定的比較函數對象或者函數指針來判斷相等。
            copy
            :復制序列。
            copy_backward
            :除了元素以相反的順序被拷貝外,別的和 copy 相同。
            count
            :利用等于操作符,把標志范圍類的元素與輸入的值進行比較,并返回相等元素的個數。
            count_if
            :對于標志范圍類的元素,應用輸入的操作符,并返回結果為 true 的次數。
            equal
            :如果兩個序列在范圍內的元素都相等,則 equal 返回 true 。重載版本使用輸入的操作符代替了默認的等于操作符。
            equal_range
            :返回一對 iterator ,第一個 iterator 表示由 lower_bound 返回的 iterator ,第二個表示由 upper_bound 返回的 iterator 值。
            fill
            :將輸入的值的拷貝賦給范圍內的每個元素。
            fill_n
            :將輸入的值賦值給 first frist+n 范圍內的元素。
            find
            :利用底層元素的等于操作符,對范圍內的元素與輸入的值進行比較。當匹配時,結束搜索,返回該元素的一個 InputIterator
            find_if
            :使用輸入的函數替代了等于操作符執行了 find
            find_end
            :在范圍內查找“由輸入的另外一個 iterator 對標志的第二個序列”的最后一次出現。重載版本中使用了用戶輸入的操作符替代等于操作。
            find_first_of
            :在范圍內查找“由輸入的另外一個 iterator 對標志的第二個序列”中的任意一個元素的第一次出現。重載版本中使用了用戶自定義的操作符。
            for_each
            :依次對范圍內的所有元素執行輸入的函數。
            generate
            :通過對輸入的函數 gen 的連續調用來填充指定的范圍。
            generate_n
            :填充 n 個元素。
            includes
            :判斷 [first1, last1) 的一個元素是否被包含在另外一個序列中。使用底層元素的 <= 操作符,重載版本使用用戶輸入的函數。
            inner_product
            :對兩個序列做內積 ( 對應的元素相乘,再求和 ) ,并將內積加到一個輸入的的初始值上。重載版本使用了用戶定義的操作。
            inner_merge
            :合并兩個排過序的連續序列,結果序列覆蓋了兩端范圍,重載版本使用輸入的操作進行排序。
            iter_swap
            :交換兩個 ForwardIterator 的值。
            lexicographical_compare
            :比較兩個序列。重載版本使用了用戶自定義的比較操作。
            lower_bound
            :返回一個 iterator ,它指向在范圍內的有序序列中可以插入指定值而不破壞容器順序的第一個位置。重載函數使用了自定義的比較操作。
            max
            :返回兩個元素中的較大的一個,重載版本使用了自定義的比較操作。
            max_element
            :返回一個 iterator ,指出序列中最大的元素。重載版本使用自定義的比較操作。
            min
            :兩個元素中的較小者。重載版本使用自定義的比較操作。
            min_element
            :類似與 max_element ,不過返回最小的元素。
            merge
            :合并兩個有序序列,并存放到另外一個序列中。重載版本使用自定義的比較。
            mismatch
            :并行的比較兩個序列,指出第一個不匹配的位置,它返回一對 iterator ,標志第一個不匹配的元素位置。如果都匹配,返回每個容器的 last 。重載版本使用自定義的比較操作。
            next_permutation
            :取出當前范圍內的排列,并將其重新排序為下一個排列。重載版本使用自定義的比較操作。
            nth_element
            :將范圍內的序列重新排序,使所有小于第 n 個元素的元素都出現在它前面,而大于它的都出現在后面,重載版本使用了自定義的比較操作。
            partial_sort
            :對整個序列做部分排序,被排序元素的個數正好可以被放到范圍內。重載版本使用自定義的比較操作。
            partial_sort_copy
            :與 partial_sort 相同,除了將經過排序的序列復制到另外一個容器。
            partial_sum
            :創建一個新的元素序列,其中每個元素的值代表了范圍內該位置之前所有元素之和。重載版本使用了自定義操作替代加法。
            partition
            :對范圍內元素重新排序,使用輸入的函數,把計算結果為 true 的元素都放在結果為 false 的元素之前。
            prev_permutation
            :取出范圍內的序列并將它重新排序為上一個序列。如果不存在上一個序列則返回 false 。重載版本使用自定義的比較操作。
            random_shuffle
            :對范圍內的元素隨機調整次序。重載版本輸入一個隨機數產生操作。
            remove
            :刪除在范圍內的所有等于指定的元素,注意,該函數并不真正刪除元素。內置數組不適合使用 remove remove_if 函數。
            remove_copy
            :將所有不匹配的元素都復制到一個指定容器,返回的 OutputIterator 指向被拷貝的末元素的下一個位置。
            remove_if
            :刪除所有范圍內輸入操作結果為 true 的元素。
            remove_copy_if
            :將所有不匹配的元素拷貝到一個指定容器。
            replace
            :將范圍內的所有等于 old_value 的元素都用 new_value 替代。
            replace_copy
            :與 replace 類似,不過將結果寫入另外一個容器。
            replace_if
            :將范圍內的所有操作結果為 true 的元素用新值替代。
            replace_copy_if
            :類似與 replace_if ,不過將結果寫入另外一個容器。
            reverse
            :將范圍內元素重新按反序排列。
            reverse_copy
            :類似與 reverse ,不過將結果寫入另外一個容器。
            rotate
            :將范圍內的元素移到容器末尾,由 middle 指向的元素成為容器第一個元素。
            rotate_copy
            :類似與 rotate ,不過將結果寫入另外一個容器。
            search
            :給出了兩個范圍,返回一個 iterator ,指向在范圍內第一次出現子序列的位置。重載版本使用自定義的比較操作。
            search_n
            :在范圍內查找 value 出現 n 次的子序列。重載版本使用自定義的比較操作。
            set_difference
            :構造一個排過序的序列,其中的元素出現在第一個序列中,但是不包含在第二個序列中。重載版本使用自定義的比較操作。
            set_intersection
            :構造一個排過序的序列,其中的元素在兩個序列中都存在。重載版本使用自定義的比較操作。
            set_symmetric_difference
            :構造一個排過序的序列,其中的元素在第一個序列中出現,但是不出現在第二個序列中。重載版本使用自定義的比較操作。
            set_union
            :構造一個排過序的序列,它包含兩個序列中的所有的不重復元素。重載版本使用自定義的比較操作。
            sort
            :以升序重新排列范圍內的元素,重載版本使用了自定義的比較操作。
            stable_partition
            :與 partition 類似,不過它不保證保留容器中的相對順序。
            stable_sort
            :類似與 sort ,不過保留相等元素之間的順序關系。
            swap
            :交換存儲在兩個對象中的值。
            swap_range
            :將在范圍內的元素與另外一個序列的元素值進行交換。
            transform
            :將輸入的操作作用在范圍內的每個元素上,并產生一個新的序列。重載版本將操作作用在一對元素上,另外一個元素來自輸入的另外一個序列。結果輸出到指定的容器。
            unique
            :清除序列中重復的元素,和 remove 類似,它也不能真正的刪除元素。重載版本使用了自定義的操作。
            unique_copy
            :類似與 unique ,不過它把結果輸出到另外一個容器。
            upper_bound
            :返回一個 iterator ,它指向在范圍內的有序序列中插入 value 而不破壞容器順序的最后一個位置,該位置標志了一個大于 value 的值。重載版本使用了輸入的比較操作。
            堆算法: C++ 標準庫提供的是 max-heap 。一共由以下 4 個泛型堆算法。
            make_heap
            :把范圍內的元素生成一個堆。重載版本使用自定義的比較操作。
            pop_heap
            :并不是真正的把最大元素從堆中彈出,而是重新排序堆。它把 first last-1 交換,然后重新做成一個堆。可以使用容器的 back 來訪問被“彈出“的元素或者使用 pop_back 來真正的刪除。重載版本使用自定義的比較操作。
            push_heap
            :假設 first last-1 是一個有效的堆,要被加入堆的元素在位置 last-1 ,重新生成堆。在指向該函數前,必須先把元素插入容器后。重載版本使用指定的比較。
            sort_heap
            :對范圍內的序列重新排序,它假設該序列是個有序的堆。重載版本使用自定義的比較操作。

            接下來: STL容器學習

            posted on 2007-03-14 16:04 夢在天涯 閱讀(11783) 評論(2)  編輯 收藏 引用 所屬分類: CPlusPlus

            評論

            # re: STL算法學習 2007-03-15 09:19 Galaxy_Yang

            不錯, 還不熟悉STL的函數對象啊,
            看來, 在以后的工作中要多熟悉sTL的算法了

            很好, 支持這樣的總結!  回復  更多評論   

            # re: STL算法學習[未登錄] 2008-12-19 21:02 熊哥

            very good!  回復  更多評論   

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804159
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久亚洲高清综合| 久久午夜无码鲁丝片午夜精品| 欧美亚洲色综久久精品国产| 欧美va久久久噜噜噜久久| 97久久精品无码一区二区| 久久人人超碰精品CAOPOREN | 波多野结衣久久精品| 九九久久自然熟的香蕉图片| 精品人妻伦九区久久AAA片69| 色8久久人人97超碰香蕉987| 国产99久久久国产精品~~牛| 狠狠色丁香久久婷婷综合_中 | 欧美日韩中文字幕久久久不卡 | 国产情侣久久久久aⅴ免费| 久久久精品波多野结衣| 国产精品18久久久久久vr| 国产成人久久精品一区二区三区| 99久久精品费精品国产| 国产亚洲精久久久久久无码| 色妞色综合久久夜夜| 日本亚洲色大成网站WWW久久| 99久久er这里只有精品18| 久久久SS麻豆欧美国产日韩| 日韩欧美亚洲综合久久影院Ds| 77777亚洲午夜久久多喷| 无码人妻精品一区二区三区久久久| 美女久久久久久| 久久精品不卡| 精品久久久久久国产牛牛app| 久久精品国内一区二区三区| 久久久久久亚洲AV无码专区| 久久婷婷五月综合国产尤物app| 久久精品国产亚洲av麻豆蜜芽| 99精品国产免费久久久久久下载| 久久免费视频1| 久久亚洲熟女cc98cm| 久久亚洲AV无码精品色午夜| 18岁日韩内射颜射午夜久久成人| 亚洲中文久久精品无码| 精品国产乱码久久久久久1区2区| 精品久久一区二区|