【C++STL】トラバーサルアルゴリズム(for_each)の原理と使い方

1.STLアルゴリズムの概要

  1. アルゴリズムは主にヘッダー ファイル<algorithm> <functional> <numeric>に含まれています
  2. <algorithm>これはすべての STL ヘッダー ファイルの中で最大であり、トラバーサル、比較、検索、交換、コピー、変更、その他の操作が含まれます。
  3. <functional>関数オブジェクトを宣言するためのいくつかのテンプレート クラスを定義します。
  4. <numeric>最小限。シーケンスに対して単純な数学演算を実行する少数のテンプレート関数のみが含まれます。

アルゴリズムは、質的変化アルゴリズム非質的変化アルゴリズムに分けられます。

  • 質的変更アルゴリズム: 操作中に区間内の要素の内容が変更されます。たとえば、コピー、置換、削除などです。
  • 非定性アルゴリズム: 区間内の要素の内容は、検索、カウント、トラバース、極値の検索などの操作プロセス中に変更されません。

二、for_each

機能:コンテナ内のすべての要素を走査します。

  • for_each()このアルゴリズムは非常に柔軟であり、さまざまな方法で各要素にアクセス、処理、変更できます。したがって、for_each()これは質的変化アルゴリズムであると同時に非質的アルゴリズムでもあります。
関数プロトタイプ: for_each(イテレータ開始、イテレータ終了、関数) 説明する
パラメータ1 イテレータが頼む イテレータの開始
パラメータ2 イテレータの終了 終了反復子
パラメータ3 機能 関数または関数オブジェクト

成し遂げる:

//for_each()的实现如下
template <typename Iterator, typename Operation>
    Operation for_each (Iterator beg, Iterator end, Operation op)
    {
    
    
        while(beg != end)
        {
    
    
            op(*beg);
            ++beg;
        }
        return op;
    }

例:

#include <iostream>
#include <algorithm> //必须包含该头文件
#include <vector>
using namespace std;

//普通函数
void printA(int value)
{
    
    
	cout << value << " ";
}

//函数对象(仿函数)
class printB
{
    
    
public:
	void operator()(int value)
	{
    
    
		cout << value << " ";
	}
};

class printC
{
    
    
public:
	void operator()(int& value)
	{
    
    
		value = value + 1;    //修改入参的值
		cout << value << " ";
	}
};

void test01() 
{
    
    
	vector<int> vec;
	for (int i = 0; i < 10; i++)
	{
    
    
		vec.push_back(i);
	}

	//普通函数遍历算法
	cout << "for_each printA:";
	for_each(vec.begin(), vec.end(), printA);
	cout << endl;

	//函数对象(仿函数)遍历算法-非质变算法
	cout << "for_each printB():";
	for_each(vec.begin(), vec.end(), printB());
	cout << endl;

	//函数对象(仿函数)遍历算法-质变算法
	cout << "for_each printC():";
	for_each(vec.begin(), vec.end(), printC());
	cout << endl;
}

int main()
{
    
    
	test01();
	system("pause");
	return 0;
}
//result
for_each printA:0 1 2 3 4 5 6 7 8 9
for_each printB():0 1 2 3 4 5 6 7 8 9
for_each printC():1 2 3 4 5 6 7 8 9 10

注: C++11 以降、range-based for循环より便利で自然なトラバーサル メソッドが提供されています。したがって、for_each()アルゴリズムの重要性は徐々に低下する可能性があります。


この記事が参考になったら「いいね!」をお願いします!

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/AAADiao/article/details/130992259