C++STL算法篇

前言

上一章節主要是詳細介紹了C++STL迭代器,而且簡單模擬了一下list中的容器,不清楚的能夠回顧一下哦。本章節主要針對於C++算法作個詳細介紹。STL中算法大體分爲四類:算法

  • 非可變序列算法:不修改容器內容的算法。    編程

  • 可變序列算法:修改容器內容的算法。 微信

  • 排序算法:排序合併搜索等內容的算法         app

  • 數值算法:對容器內容進行數值計算。    dom

C++STL中70+的算法,如下對稍微經常使用的算法進行細緻分類並標明功能。編輯器

查找算法

查找算法就是判斷容器中是否包含某個值,主要的查找算法主要是有如下13個:函數

  • adjacent_find : 查重複數,返回首個元素iter測試

  • bianry_search: 二分查找flex

  • count: 區間統計
    url

  • count_if: 範圍查找統計個數

    equal: 比較

  • equal_range :區間元素比較

  • find:區間查找元素

  • find_first_of:區間查找第一次出現值

  • find_if : 條件查找

  • upper_bound:查找最後一個大於等於val的位置

  • lower_bound: 查找第一個大於等於val的位置

  • search:子序列查找位置

  • search_n:子序列查找出現次數

部分函數的測試代碼以下:

排序和通用算法

排序和通用算法就是用來給容器排序,主要的排序算法主要是有如下14個:

  • merge: 歸併排序,存於新容器

  • inpace_merge: 歸併排序,覆蓋原區間

  • sort: 排序,更改原容器順序

  • stable_sort: 排序,保存原容器數據順序

    nth_element: 關鍵字排序

  • partition:範圍排序

  • partial_sort:範圍排序

  • partial_sort_copy:範圍排序外加複製操做

  • stable_partition: 範圍排序,保存原容器順序

  • random_shuffle: 隨機排序

  • reverse:逆序原容器

  • reverse_copy: 逆序容器保存到新容器

  • rotate:移動元素到容器末尾

  • rotate_copy:移動元素到新容器

部分函數的測試代碼以下:

對於排序,值得一說的是list是不能採用通用排序算法sort,只能使用內置的sort函數哦。

刪除和替換算法

刪除和替換算法通常都會修改容器的存儲現狀,通常處理刪除和替換的算法主要有如下的15

  • copy: 拷貝函數

  • copy_backward: 逆序拷貝

  • iter_swap: 交換

  • remove: 刪除

    remove_copy: 刪除元素複製到新容器

  • remove_if:條件刪除

  • remove_copy_if:條件刪除拷貝到新容器

  • replace:替換

  • replace_copy: 替換,結果放到新容器

  • replace_if: 條件替換

  • replace_copy_if:條件替換,結果另存

  • swap: 交換

  • swap_range:區間交換

  • unique:去重

    unique_copy:去重,結果另存

部分函數的測試代碼以下:

排列組合算法

提供計算給定集合按必定順序的全部可能排列組合 ,主要有如下兩個:

next_permutation:下一個排序序列的組合

prev_permutation:上一個排序序列的組合

有意思的是這裏所說的上一個和下一次是什麼意思?所謂「下一個」和「上一個」,舉了一個簡單的例子:對序列 {a, b, c},每個元素都比後面的小,按照字典序列,固定a以後,a比bc都小,c比b大,它的下一個序列即爲{a, c, b},而{a, c, b}的上一個序列即爲{a, b, c},同理能夠推出全部的六個序列爲:{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a},其中{a, b, c}沒有上一個元素,{c, b, a}沒有下一個元素。接下來用代碼簡單測試下,以下測試代碼:

算術算法

算術運算算法主要用來作容器的算術運算,使用的時候加上numeric頭文件,主要有如下4個:

accumulate:區間求和

partial_sum:相鄰元素的和

inner_product:序列內積運算

adjacent_difference:相鄰元素的差

部分函數測試代碼:

生成和異變算法

生成和一遍算法總共有如下6個下,相對於來講for_each用的相對於來講更多一些:

for_each:迭代訪問

fill:填充方式初始容器

fill_n:指定長度填充容器

generate_n:填充前n個位置

transform:一元轉換和二元轉換

關係算法

關係算法相似與條件表達式同樣的做用,主要用來判斷容器中元素是否相等等運算,主要有如下8個:

equal:兩容器元素是否都相同

includes:是不是包含關係

lexicographical_compare:比較兩個序列

max:求最大值

max_element:返回最大值的iterator

min:求最小值

min_element:求最小值的iterator

mismatch:找到第一個不一樣的位置

集合算法

集合算法主要是集合上的一些運算,例如集合加法:並集,集合的減法:差集,還有交集。主要有如下4個:

set_union:差集

set_intersection:並集

set_difference:保存第一個中有第二個沒有的元素

set_symmetric_difference:對稱差集

部分函數測試代碼以下:

堆算法

堆算法,就是把容器當作堆去操做,主要算法函數只有如下4個:

make_heap:生成一個堆

pop_heap:出堆

push_heap:入堆

sort_heap:堆排序

測試代碼以下:

尾言

本章節到此結束,做業:使用一些算法,分析上述算法的運行結果。

本文分享自微信公衆號 - C語言編程基礎(goodStudyCode)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索