C ++ STL(12):一般的に使用されるトラバーサルアルゴリズム(for_each、transform)


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;
}

おすすめ

転載: blog.csdn.net/newson92/article/details/114242754