簡単なプログラム解釈C++STLアルゴリズムシリーズの11:search_n


C++STLの非可変アルゴリズム(Non-mutating algorithms)は、操作データを破壊しないテンプレート関数のセットであり、シーケンスデータの個々の処理、要素検索、サブシーケンス検索、統計、マッチングを行うために使用される.
繰り返しメタサブシーケンス検索search_nアルゴリズム:一連の要素値が所定の値のサブシーケンスであるかどうかを検索します.次の2つの関数プロトタイプがあります.反復器区間[first,last]でcount個の連続要素があるかどうかをそれぞれ検索し、その値はvalue(または述語判断binary_predの条件を満たす)に等しく、サブシーケンスの最初の要素の反復器、またはlastを返して重複要素のないサブシーケンスを表す.
関数のプロトタイプ:
template<class ForwardIterator1, class Diff2, class Type>
   ForwardIterator1 search_n(
      ForwardIterator1 _First1, 
      ForwardIterator1 _Last1,
      Size2 _Count, 
      const Type& _Val
   );
template<class ForwardIterator1, class Size2, class Type, class BinaryPredicate>
   ForwardIterator1 search_n(
      ForwardIterator1 _First1, 
      ForwardIterator1 _Last1,
      Size2 _Count, 
      const Type& _Val,
      BinaryPredicate _Comp
   );
 

サンプル・プログラム:
探索ベクトル容器ivect={1,8,8,8,4,,4,3}の3つの連続要素は8であり、4つの連続要素は8ではなく、3つの連続要素の2倍は16である.
/*******************************************************************
 * Copyright (C) Jerry Jiang            
 * File Name   : search_n.cpp
 * Author      : Jerry Jiang
 * Create Time : 2011-10-11 22:23:47
 * Mail        : [email protected]
 * Blog        : http://blog.csdn.net/jerryjbiao              
 * Description :         C++ STL                       
 *                      :          search_n      
 ******************************************************************/

#include <algorithm>
#include <vector>
#include <iostream>

bool twice(const int para1, const int para2)
{
	return 2 * para1 == para2;
}

using namespace std;

int main()
{
	vector<int> ivect;
	ivect.push_back(1);
	ivect.push_back(8);
	ivect.push_back(8);
	ivect.push_back(8);
	ivect.push_back(4);
	ivect.push_back(4);
	ivect.push_back(3);

	vector<int>::iterator iLocation;
	iLocation = search_n(ivect.begin(), ivect.end(), 3, 8);
	if (iLocation != ivect.end())
	{
		cout << " ivect   3      8" << endl;
	}
	else
	{
		cout << " ivect   3      8" << endl;
	}

	iLocation = search_n(ivect.begin(), ivect.end(), 4, 8);
	if (iLocation != ivect.end())
	{
		cout << " ivect   4      8" << endl;
	}
	else
	{
		cout << " ivect   4      8" << endl;
	}

	iLocation = search_n(ivect.begin(), ivect.end(), 2, 4);
	if (iLocation != ivect.end())
	{
		cout << " ivect   2      4" << endl;
	}
	else
	{
		cout << " ivect   2      4" << endl;
	}

	iLocation = search_n(ivect.begin(), ivect.end(), 3, 16, twice);
	if (iLocation != ivect.end())
	{
		cout << " ivect   3         16" << endl;
	}
	else
	{
		cout << " ivect   3         16" << endl;
	}
	return 0;
}

 *******************************************************************************************************************************
C++経典書目索引及び資源ダウンロード:http://blog.csdn.net/jerryjbiao/article/details/7358796
********************************************************************************************************************************