C++ STL アルゴリズム ライブラリ アルゴリズム、数値、関数、メモリ、イテレータ、ユーティリティには、一般的に使用される関数のリストが含まれています

Part.0 はじめに

ここに画像の説明を挿入

公式サイト:https: //cplusplus.com/reference/

このブログ投稿には、C++ アルゴリズム ライブラリを使用するときに作成者がよく使用するいくつかの関数が記録されています。将来参照するための辞書のように機能します。

Part.I アルゴリズム

ヘッダー ファイルでは#include <algorithm>、並べ替え、並べ替え、結合、検索などの一般的なアルゴリズムによって実装された一連の機能が提供されます。公式サイトでよく使われる機能一覧は以下の通りです。


検索操作

関数 意味
*min_element(v.begin(), v.end()) v範囲[begin,end)内のデータの最小値を見つけます。
*max_element(v.begin(), v.end()) v範囲[begin,end)内のデータの最大値を見つけます
min()/max() 最小値/最大値を返します。受信パラメータは 2 つの単純な数値または配列にすることができますが、コンテナにすることはできません。コンテナは上記のものを使用する必要があります。
minmax() 最大値と最小値を返します
find(v.begin(),v.end(),key) の範囲内のデータを検索し、見つかったv場合はvalue のイテレータを返し、それ以外の場合は返します。[begin,end)keykeyend
count(v.begin(),v.end(),key) v範囲内[begin,end)統計key値の数
mismatch(v1.begin(), v1.end(), v2); 返された範囲のデータがそれv1同じかどうか、初めて異なるデータを返します。戻り値は[begin,end)v2pair
equal(v1.begin(), v1.end(), v2); 判定v1範囲[begin,end)内のデータが とv2同じかどうか。同じものを返します、そうでないtrue場合は返しますfalse
is_permutation(v1.begin(), v1.end(), v2.begin()) 判定対象範囲のデータが含まれる要素v1と同じ、同じ順序でないか。同じものを返します、そうでない場合は返します[begin,end)v2truefalse
search(v1.begin(), v1.end(), v2.begin(), v2.end(),) の範囲内で に等しいデータ セグメントを検索しv1一致するデータ セグメントの最初の要素のイテレータを返します。見つからない場合は return返します[begin,end)v2[begin,end)v1v2v1.end()
search_n(v.begin(),v.end(),n,tar) の範囲でターゲット データを検索し、見つかったv場合は最初のイテレータを返します。[begin,end)ntartar
shuffle(v.begin(), v.end() v範囲[begin,end)内のデータの順序を入れ替える
all_of(v.begin(), v.end(),func) 範囲内のデータが条件を満たしているかどうかを判定しv満たしている場合は返します。[begin,end)functruefalse
any_of(v.begin(), v.end(),func) 範囲内に条件を満たすデータがあるかどうかを判定しvあればreturn、なければreturn[begin,end)functruefalse
none_of(v.begin(), v.end(),func) vの範囲のデータが[begin,end)満たされていないか判断しfunc、満たしていない場合は return、そうでないtrue場合は returnfalse

操作を変更する

関数 意味
transform(v1.begin(), v1.end(), v2.begin(), op_increase); から までv1[begin,end)範囲のデータをop_increase代入しますv2
replace(v.begin(), v.end(), a, b); の範囲v[begin,end)データをa置換しますb
fill(v.begin(),v.begin()+4,5); からv[begin,begin+4)範囲内のすべてのデータ値を設定します5
remove(v.begin(), v.end(),rm) 値が範囲内のデータvすべて削除します。[begin,end)rm
reverse(v.begin(),v.end()) v[begin,end)範囲のデータを反転します
unique (v.begin(), v.end()) ~のv範囲[begin,end)内のデータを一意化する
rotate(v.begin(),v.begin()+3,v.end()) vの最初の 3 つの要素を最後に配置します。相対的な順序は変わりません。

ソート操作

関数 意味
sort(v.begin(),v.end(),cmp) 範囲内のデータをルールに従って昇順に並べますv逆順には逆反復子を使用できます。[begin,end)cmprbegin
is_sorted(v.begin(),v.end()) 範囲内のデータがすでに並べ替えられているvかどうかを判断します[begin,end)

二分探索

関数 意味
lower_bound(v.begin(), v.end(), tar); 値がソートされた範囲より小さい要素を検索し、 +1 より小さい最後のv要素のイテレータを返します。[begin,end)tartar
upper_bound(v.begin(), v.end(), tar) ソートされた範囲内で以下の値を持つ要素を検索しv最初のより大きい値の反復子を返します。[begin,end)tartar
equal_range(v.begin(), v.end(), tar); range 内のデータと等しいデータの範囲を返し、 1 を返し範囲内のデータは次の値vに等しい[begin,end)tarpair[pair.first,pair.second)tar
binary_search(v.begin(), v.end(), tar) vの範囲内で[begin,end)二分探索の方法で検索しtar、見つかった場合は戻りtrue、そうでない場合は戻ります。false

ヒープ

関数 意味
make_heap(v.begin(),v.end()) v要素はデフォルトのビッグトップヒープでソートされます
pop_heap(v.begin(),v.end()); ポップアップのトップ要素
push_heap(v.begin(),v.end()); 要素をヒープに追加する
sort_heap(v.begin(),v.end()); ヒープ内の要素を並べ替える
is_heap(v.begin(),v.end()); ヒープかどうかを判断する

他の

関数 意味
merge(v1,v1+5,v2,v2+5,v.begin()); 結合しv1v2一緒に上昇する
includes(v1,v1+10,v2,v2+4) v1含めるかどうかを決定するv2
set_union(v1, v1+5, v2, v2+5, v.begin()); v1合計されたv2コレクションは次の場所に保存されます。v
set_intersection(v1, v1+5, v2, v2+5, v.begin()) v1v2的交集存于v,返回交集最后一个元素的迭代器+1
set_difference(v1, v1+5, v2, v2+5, v.begin()) v1v2的差集存于v
set_symmetric_difference(v1, v1+5, v2, v2+5, v.begin()) v1v2的互差集存于vset_difference只包含v1不包含v2的元素,它都包含,就是不包含公共的元素。
lexicographical_compare(v1,v1+5,v2,v2+9) 比较v1v2的大小,默认小true
next_permutation(v,v+3) v变为其下一次置换,尽可能小数在前
pre_permutation(v,v+3) v变为其上一次置换,尽可能小数在前,否极泰来

Part.II numeric

处于头文件#include <numeric> 中,定义了常用的数学实现函数。官网中一共5个函数,列表如下:

函数 含义
accumulate(v.begin(),v.end(),0); 返回v[begin,end)范围内的数据累加和
accumulate(v.begin(),v.end(), init, std::minus<int>()) 返回初始值init减去v[begin,end)范围内的数据所得到的结果。可以看到第四个参数默认是加法std::plus<int>(),这里是减法,还可以是乘法std::multiplies<int>(),除法std::divides<int>(),或者自己定义的运算myfunc
adjacent_difference(v.begin(),v.end(), result, minus<int>()) v[begin,end)范围内的数据相邻元素进行std::minus<int>()操作(后一个减前一个,首项不变,默认是减法,当然也可是其他运算),第三个参数是返回结果。
inner_product(v1.begin(),v1.end(), v2, init,minus<int>(),divides<int>()); v1[begin,end)范围内的元素和v2做内积(默认相乘相加),加到初始值为init上,并返回结果。当然这里是相减相除,也可以是自己定义的运算。
partial_sum(v.begin(),v.end(), result, std::multiplies<int>()); v[begin,end)范围内的数据进行前缀和(部分和)multiplies运算(默认是加法),并将结果赋值给result
std::iota(v.begin(),v.end(),init); init顺次增加1赋值给向量v,包括init

Part.III functional

处于头文件#include <functional> 中,定义了许多函数对象类型和支持函数对象的功能。因为里面的函数实现大多是为别的类中的函数提供便利和支持的,因此就不详细列举了(像加-减-乘-除-模-非[反号] plus-minus-multiplies-divides-modulus-negate都是在里面定义的),详细介绍可看官网

Part.IV memory

处于头文件#include <memory> 中,给容器、管理内存的函数和auto_ptr模板类定义标准内存分配器。官网中常用的函数列表如下:

函数 含义
T* allocate(size_t n); 分配足够的存储空间来存储T的n个实例,并返回指向它的指针
auto sp = std::make_shared<int>(); 分配堆空间,创建智能指针make_shared,用指针鼓励用这个,不要用new

  • 之前我一直以为memcpysizeof是在这个头文件中包含的,但是后来发现并没有,sizeof是C++的一个关键字,memcpy是在string.h中定义的。

Part.V iterator

处于头文件#include <iterator> 中,给迭代器(可以将其简单理解为指针,*itr可以获取迭代器itr所指向的值)提供定义和支持。官网中常用的函数列表如下:

函数 含义
advance(it,n); イテレータをユニット単位でitr進めますnたとえば、itr最初はインデックスを指し1、この命令の実行後はインデックスを指します。1+n
distance(v.begin(),itr) itrイテレータ間のv.begin()距離を返します。
begin(container) containerコンテナの開始インデックスを返します。
begin(container) containerコンテナの最後のインデックスを返します。これは通常、end()コンテナの終わりを示し、値を指すものではないことに注意してください。
prev(itr) itrイテレータを前のイテレータに戻します
next(itr) itrイテレータの後にイテレータを返します

Part.VI ユーティリティ

ヘッダー ファイルで#include <utility>、オーバーロードされた関係演算子を定義して、関係演算子の記述を簡素化します。公式サイトでよく使われる機能一覧は以下の通りです。

関数 意味
swap(a,b) aとの値を交換しますb。両方とも同じ型である限り、交換できます。
make_pair(x,y) (x,y)で構成されるリターンpair

おすすめ

転載: blog.csdn.net/Gou_Hailong/article/details/128476298