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) key key end |
count(v.begin(),v.end(),key) |
v 範囲内の[begin,end) 統計key 値の数 |
mismatch(v1.begin(), v1.end(), v2); |
返された範囲のデータがそれとv1 同じかどうか、初めて異なるデータを返します。戻り値は[begin,end) v2 pair |
equal(v1.begin(), v1.end(), v2); |
判定v1 範囲[begin,end) 内のデータが とv2 同じかどうか。同じものを返します、そうでないtrue 場合は返しますfalse |
is_permutation(v1.begin(), v1.end(), v2.begin()) |
判定対象範囲のデータが含まれる要素v1 と同じか、同じ順序でないか。同じものを返します、そうでない場合は返します[begin,end) v2 true false |
search(v1.begin(), v1.end(), v2.begin(), v2.end(),) |
の範囲内で に等しいデータ セグメントを検索しv1 、一致するデータ セグメントの最初の要素のイテレータを返します。見つからない場合は returnを返します。[begin,end) v2 [begin,end) v1 v2 v1.end() |
search_n(v.begin(),v.end(),n,tar) |
の範囲でターゲット データを検索し、見つかったv 場合は最初のイテレータを返します。[begin,end) n tar tar |
shuffle(v.begin(), v.end() |
v 範囲[begin,end) 内のデータの順序を入れ替える |
all_of(v.begin(), v.end(),func) |
範囲内のデータが条件を満たしているかどうかを判定しv 、満たしている場合は返します。[begin,end) func true false |
any_of(v.begin(), v.end(),func) |
範囲内に条件を満たすデータがあるかどうかを判定しv 、あればreturn、なければreturn[begin,end) func true false |
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) cmp rbegin |
is_sorted(v.begin(),v.end()) |
範囲内のデータがすでに並べ替えられているv かどうかを判断します[begin,end) |
二分探索
関数 | 意味 |
---|---|
lower_bound(v.begin(), v.end(), tar); |
値がソートされた範囲より小さい要素を検索し、 +1 より小さい最後のv 要素のイテレータを返します。[begin,end) tar tar |
upper_bound(v.begin(), v.end(), tar) |
ソートされた範囲内で以下の値を持つ要素を検索しv 、最初のより大きい値の反復子を返します。[begin,end) tar tar |
equal_range(v.begin(), v.end(), tar); |
range 内のデータと等しいデータの範囲を返し、 1 を返し、範囲内のデータは次の値v に等しい[begin,end) tar pair [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()); |
結合しv1 てv2 一緒に上昇する |
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()) |
取v1 和v2 的交集存于v ,返回交集最后一个元素的迭代器+1 |
set_difference(v1, v1+5, v2, v2+5, v.begin()) |
取v1 减v2 的差集存于v |
set_symmetric_difference(v1, v1+5, v2, v2+5, v.begin()) |
取v1 与v2 的互差集存于v ,set_difference 只包含v1 不包含v2 的元素,它都包含,就是不包含公共的元素。 |
lexicographical_compare(v1,v1+5,v2,v2+9) |
比较v1 与v2 的大小,默认小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 |
- 之前我一直以为
memcpy
和sizeof
是在这个头文件中包含的,但是后来发现并没有,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 |