記事のディレクトリ
0STLアルゴリズム
STLアルゴリズムは、ヘッダー構成<algorithm>
<functional>
<numeric>
などで構成されます。:操作のトラバース、検索、並べ替え、比較、交換、コピー、および変更のための関数テンプレートを含めます。:関数オブジェクト/ファンクターに関連するクラステンプレートを含めます。:サイズが小さく、単純な数学演算に関連する関数テンプレートのみが含まれています。
<algorithm>
<functional>
<numeric>
1一般的に使用されるトラバーサルアルゴリズムの概要[for_each、transform]
アルゴリズムの紹介::
for_each
コンテナ要素と統合ロジック処理をトラバースします。
transform
:ソースコンテナのすべての要素をターゲットコンテナにコピーします。
2 for_each [コンテナ要素のトラバーサルと統合ロジック処理]
役割:コンテナ要素と統合ロジック処理をトラバースします。
注:
for_each
アルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
。
関数プロトタイプ:
for_each(iterator begin, iterator end, _func);
パラメータの説明::イテレータの
begin
開始位置
end
; :イテレータの終了位置
_func
;:現在トラバースされているコンテナ要素の処理。
①通常のコールバック関数;
②関数オブジェクト/関数;
③匿名関数(ラムダ式)。
例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用for_each算法
//普通回调函数
void print(int val) {
cout << val << " ";
}
//函数对象/仿函数
class Printer{
public:
void operator()(int val) {
cout << val << " ";
}
};
int main() {
vector<int> v;
v.push_back(9);
v.push_back(1);
v.push_back(7);
v.push_back(6);
v.push_back(3);
/* 遍历容器元素 */
//1.for_each算法 + 普通回调函数————传递函数名
for_each(v.begin(), v.end(), print); //9 1 7 6 3
//2.for_each算法 + 函数对象/仿函数————传递匿名函数对象
for_each(v.begin(), v.end(), Printer()); //9 1 7 6 3
//3.for_each算法 + 匿名函数(lambda表达式)
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //9 1 7 6 3
/* 对容器元素的统一逻辑处理 */
//全部容器元素的值减1后输出
for_each(v.begin(), v.end(), [](int val) {
cout << val - 1 << " "; }); //8 0 6 5 2
return 0;
}
3変換[ソースコンテナのすべての要素をターゲットコンテナにコピーします]
機能:ソースコンテナのすべての要素をターゲットコンテナにコピーします。
注1:
transform
アルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
。
注2:transform
アルゴリズムを使用する場合は、ターゲットコンテナである必要があります事前にメモリスペースを開放してください、dest.resize(src.size());
など。それ以外の場合、実行時にプログラムがクラッシュします。
関数プロトタイプ:
transform(iterator begin1, iterator end1, iterator begin2, _func);
パラメータ説明::
begin1
の開始位置
end1
ソース容器イテレータ;:源容器イテレータの終了位置
begin2
;:ターゲットコンテナイテレータの開始位置
_func
、現在トラバーサルコンテナ要素の論理演算処理を行います。
①通常のコールバック関数;
②関数オブジェクト/関数;
③匿名関数(ラムダ式)。
例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用transform算法
//普通回调函数
int print(int val) {
//元素值加10
return val + 10;
}
//函数对象/仿函数
class Printer {
public:
int operator()(int val) {
//直接返回元素
return val;
}
};
int main() {
vector<int> src;
for(int i = 0; i < 5; i++){
src.push_back(i);
}
/* 拷贝容器的全部元素,必须为目标容器提前开辟内存空间 */
vector<int> dest;
dest.resize(src.size());
//1.transform算法 + 普通回调函数————传递函数名
transform(src.begin(), src.end(), dest.begin(), print);
for_each(dest.begin(), dest.end(), [](int val) {
cout << val << " "; }); //10 11 12 13 14
//2.transform算法 + 函数对象/仿函数————传递匿名函数对象
transform(src.begin(), src.end(), dest.begin(), Printer());
for_each(dest.begin(), dest.end(), [](int val) {
cout << val << " "; }); //0 1 2 3 4
//3.transform算法 + 匿名函数(lambda表达式)
transform(src.begin(), src.end(), dest.begin(), [](int val) {
return val + 20; });
for_each(dest.begin(), dest.end(), [](int val) {
cout << val << " "; }); //20 21 22 23 24
return 0;
}