STL(一般的に巡回、検索アルゴリズム)
10199 ワード
4.2アルゴリズムの概要
アルゴリズムは主にヘッダファイルから構成されています.
すべてのSTLヘッダの中で最大の機能です.ここでよく使われている機能は比較、交換、検索、遍歴、コピー、修正、反転、並べ替え、マージなど…
体積はとても小さくて、いくつかのシーケンスの容器の上で行う簡単な運算のテンプレート関数だけを含みます.
関数オブジェクトを宣言するためのテンプレートクラスを指定します.
4.3一般的な巡回アルゴリズム
/* アルゴリズムを巡回してコンテナ要素を巡回します. @param begスタート @param end終了 @パラムcalback 関数のコールバックまたは関数オブジェクト @return関数オブジェクト*/for_each(iterator beg、iteratonid、calback); トランスフォームアルゴリズムは指定容器の区間要素を別の容器に運搬します. 注意:transformは目標容器にメモリを割り当てませんので、メモリを事前に割り当てておく必要があります. @param beg 1ソース容器からローズマリーを開始します. @param end 1ソース容器終了ディショナー @param beg 2ターゲット容器からローズマリーを開始します. @パラムcakbackコールバック関数または関数オブジェクト @returnはターゲットコンテナのディレクタ*/tranformに戻ります.(iterator beg 1、iteraton end 1、iterator beg 2、_calbakc)
for_each:
/* template inline void for ueach(_InIt_First,_InIt_Last,_Fn 1_Fun){ for(;u First!=u Last;+u First) _Funnc(*`First); */ //一般関数void print 01(int val){ cout<///関数オブジェクトstruct print 001{ void operator()(int val){ cout<>; } }; //for ueachアルゴリズムの基本的な使い方void test 01(){ vectorv; for(int i=0;i<10;i+){ v.pusic(i) } //アルゴリズムを巡回 for ueach(v.begin()、v.end()、print 01) cout<>; mCount++; } int mCount;;; //フォーメーション戻り値void test 02(){ vectorv; for(int i=0;i<10;i+){ v.pusic(i) } print 02 p=for ueach(v.begin()、v.end()、print 02() cout< struct print 03:public binary ufunction<int,int,void>{ void operator(int val,int bindParam)const{ cout<<""; } }; //フォーマルバインディングパラメータ出力void test 03() vectorv; for(int i=0;i<10;i+){ v.pusic(i) } for yuach(v.begin()、v.end()、bind 2 nd(print 03(100)));
transform:
//transform別の容器に一つの容器の値を運ぶ/* template inline _OutIt_Trans form(_InIt_First、_InIt_Last、_OutIt_Dest、_Fn 1_Fun) { for(;u First!=u Last;+u First、+u Dest) *_Dest=_Fun(*_First) return(_Dest) } template inline _OutIt_Trans form(_InIt 1_First 1,_InIt 1_Last 1,_InIt 2_First 2,_OutIt_Dest,_Fn 2_Fun) { for(;u First 1!=u Last 1;+u First 1,+u First 2,+u Dest) *_Dest=_Fun(*_First1、*_First2) return(_Dest) } */ struct transformTest 01{ int operator()(int val){ return val+100 } }; struct print 01{ void operator()(int val){ cout<>; } }; void test 01(){ vectorvSource; for(int i=0;i<10;i+){ vSource.pusic(i+1) } //ターゲットコンテナ vectorvTarget; //vTargetに空間を開く vTarget.resize; //vSourceの要素をvTargetに運搬します. vector:iterator it=tranform(vSource.begin()、vSource.end()、vTarget.begin()、tranformTest 01(); //印刷 forquah(vTarget.begin()、vTarget.end()、print 01();cout<vSource 1; vector<int>vSource 2; for(int i=0;i<10;i+){ vSource 1.pusic(i+1) } //ターゲットコンテナ vectorvTarget; //vTargetに空間を開く vTarget.resize; transform(vSource 1.begin()、vSource 1.end()、vSource 2.begin()、vTarget.begin()、tranformTest 02(); //印刷 forquah(vTarget.begin()、vTarget.end()、print 01();cout<
15通常はアルゴリズムを巡回します. フォーマット 戻り値があります パラメータをバインドして出力できます. トランスフォームは容器中のデータを別の容器に運びます. 注意:目標容器は空間を開拓する必要があります.
4.4通常の検索アルゴリズム
/* findアルゴリズムは要素を検索します. @param beg容器開始 @param end容器終了 @param value検索の要素 @returnは検索要素の位置*/findを返します. finduuifアルゴリズム条件検索 @param beg容器開始 @param end容器終了 @パラム calbackコールバック関数または述語(bookタイプの関数オブジェクトを返します) @return book検索はtrueに戻ります.そうでないとfalse*/finduif(iterator beg、iterator end、calback) /* adjacent_ufindアルゴリズムは隣接重複要素を検索する. @param beg容器開始 @param end容器終了 @パラム _calbackコールバック関数または述語(bookタイプの関数オブジェクトを返します) @returnは、隣接する要素の最初の位置にあるローズマリー*/adjacent_beg、iterator end、calbackを返します. binary_searchアルゴリズム二点検索法 注意:無秩序シーケンスでは使用できません. @param beg容器開始 @param end容器終了 @param value検索の要素 @return book検索はtrueに戻ります.さもなければfalse*/book binary(usearch)/* countアルゴリズム統計要素の出現回数 @param beg容器開始 @param end容器終了 @パラム valueコールバック関数または述語(bookタイプの関数オブジェクトを返します) @return intは元素の個数*/countを返します. countアルゴリズム統計要素の出現回数 @param beg容器開始 @param end容器終了 @パラム calbackコールバック関数または述語(bookタイプの関数オブジェクトを返します) @return intは元素の個数*/count uuifを返します.
16一般的な検索アルゴリズム find 値で検索 Person finduuifは条件によってPerson*を検索します. adjacent_ufindアルゴリズムは、隣接する重複要素を検索して、最初の重複要素のサブエージェント位置を返す. binary_searchアルゴリズムの2つのコンテナを検索するには順序が必要です. count count_if
アルゴリズムは主にヘッダファイルから構成されています.
すべてのSTLヘッダの中で最大の機能です.ここでよく使われている機能は比較、交換、検索、遍歴、コピー、修正、反転、並べ替え、マージなど…
体積はとても小さくて、いくつかのシーケンスの容器の上で行う簡単な運算のテンプレート関数だけを含みます.
関数オブジェクトを宣言するためのテンプレートクラスを指定します.
4.3一般的な巡回アルゴリズム
/* アルゴリズムを巡回してコンテナ要素を巡回します. @param begスタート @param end終了 @パラムcalback 関数のコールバックまたは関数オブジェクト @return関数オブジェクト*/for_each(iterator beg、iteratonid、calback); トランスフォームアルゴリズムは指定容器の区間要素を別の容器に運搬します. 注意:transformは目標容器にメモリを割り当てませんので、メモリを事前に割り当てておく必要があります. @param beg 1ソース容器からローズマリーを開始します. @param end 1ソース容器終了ディショナー @param beg 2ターゲット容器からローズマリーを開始します. @パラムcakbackコールバック関数または関数オブジェクト @returnはターゲットコンテナのディレクタ*/tranformに戻ります.(iterator beg 1、iteraton end 1、iterator beg 2、_calbakc)
for_each:
/* template inline void for ueach(_InIt_First,_InIt_Last,_Fn 1_Fun){ for(;u First!=u Last;+u First) _Funnc(*`First); */ //一般関数void print 01(int val){ cout<
transform:
//transform別の容器に一つの容器の値を運ぶ/* template inline _OutIt_Trans form(_InIt_First、_InIt_Last、_OutIt_Dest、_Fn 1_Fun) { for(;u First!=u Last;+u First、+u Dest) *_Dest=_Fun(*_First) return(_Dest) } template inline _OutIt_Trans form(_InIt 1_First 1,_InIt 1_Last 1,_InIt 2_First 2,_OutIt_Dest,_Fn 2_Fun) { for(;u First 1!=u Last 1;+u First 1,+u First 2,+u Dest) *_Dest=_Fun(*_First1、*_First2) return(_Dest) } */ struct transformTest 01{ int operator()(int val){ return val+100 } }; struct print 01{ void operator()(int val){ cout<
15通常はアルゴリズムを巡回します. フォーマット 戻り値があります パラメータをバインドして出力できます. トランスフォームは容器中のデータを別の容器に運びます. 注意:目標容器は空間を開拓する必要があります.
#include
#include
#include
#include //bind2nd
using namespace std;
/*
@param beg
@param end
@param _callback
@return
*/
void myPr(int v){
cout<v;
for(int i=0;i<10;i++){
v.push_back(i);
}
for_each(v.begin(),v.end(),myPr);
cout<v;
for(int i=0;i<10;i++){
v.push_back(i);
}
myPr03 print2=for_each(v.begin(),v.end(),myPr03());
cout<{
public:
void operator()(int v , int start ) const {
cout<v;
for(int i=0;i<10;i++){
v.push_back(i);
}
for_each(v.begin(),v.end(),bind2nd(myPr04(),1000));
}
/*
transform
: transform ,
@param beg1
@param end1
@param beg2
@param _cakkback
@return
*/
//transform(iterator beg1, iterator end1, iterator beg2, _callbakc)
//
class TransForm{
public:
int operator()(int val){
return val+10;// , ,
}
};
void test04(){
vectorv;//
for(int i=0;i<10;i++){
v.push_back(i);
}
vectorvTarget;//
// ;
vTarget.resize(v.size());
transform(v.begin(),v.end(),vTarget.begin(),TransForm());
for_each(vTarget.begin(),vTarget.end(),[](int val){cout<v1;
vectorv2;
for(int i=0;i<10;i++){
v1.push_back(100+i);
v2.push_back(200+i);
}
vectorvTarget;//
vTarget.resize(v1.size());//v1 v2
transform(v1.begin(),v1.end(),v2.begin(),vTarget.begin(),TransForm2());
for_each(vTarget.begin(),vTarget.end(),[](int val){cout<
4.4通常の検索アルゴリズム
/* findアルゴリズムは要素を検索します. @param beg容器開始 @param end容器終了 @param value検索の要素 @returnは検索要素の位置*/findを返します. finduuifアルゴリズム条件検索 @param beg容器開始 @param end容器終了 @パラム calbackコールバック関数または述語(bookタイプの関数オブジェクトを返します) @return book検索はtrueに戻ります.そうでないとfalse*/finduif(iterator beg、iterator end、calback) /* adjacent_ufindアルゴリズムは隣接重複要素を検索する. @param beg容器開始 @param end容器終了 @パラム _calbackコールバック関数または述語(bookタイプの関数オブジェクトを返します) @returnは、隣接する要素の最初の位置にあるローズマリー*/adjacent_beg、iterator end、calbackを返します. binary_searchアルゴリズム二点検索法 注意:無秩序シーケンスでは使用できません. @param beg容器開始 @param end容器終了 @param value検索の要素 @return book検索はtrueに戻ります.さもなければfalse*/book binary(usearch)/* countアルゴリズム統計要素の出現回数 @param beg容器開始 @param end容器終了 @パラム valueコールバック関数または述語(bookタイプの関数オブジェクトを返します) @return intは元素の個数*/countを返します. countアルゴリズム統計要素の出現回数 @param beg容器開始 @param end容器終了 @パラム calbackコールバック関数または述語(bookタイプの関数オブジェクトを返します) @return intは元素の個数*/count uuifを返します.
16一般的な検索アルゴリズム find 値で検索 Person finduuifは条件によってPerson*を検索します. adjacent_ufindアルゴリズムは、隣接する重複要素を検索して、最初の重複要素のサブエージェント位置を返す. binary_searchアルゴリズムの2つのコンテナを検索するには順序が必要です. count count_if
#include
#include
#include
#include
#include
using namespace std;
/*
find
@param beg
@param end
@param value
@return
*/
void test01(){
vectorv;
for(int i=0;i<10;i++){
v.push_back(i);
}
vector::iterator pos=find(v.begin(),v.end(),5);
if(pos!=v.end()){
cout<m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
bool operator==(const Person &p){
if(this->m_Name==p.m_Name&&this->m_Age==p.m_Age)
{
return true;
}
return false;
}
};
void test02(){
vector v;
Person p1("aaa",101);
Person p2("bbb",110);
Person p3("ccc",323);
Person p4("ddd",143);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
vector::iterator pos=find(v.begin(),v.end(),p2);
if(pos!=v.end()){
cout<m_Age<{
public:
bool operator()(Person * p1,Person *p2) const {
if(p1->m_Name==p2->m_Name && p1->m_Age==p2->m_Age)
{
return true;
}
return false;
}
};
void test03(){
vector v;
Person p1("aaa",101);
Person p2("bbb",20);
Person p3("ccc",323);
Person p4("ddd",143);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
Person *p=new Person("bbb",20);
vector::iterator pos=find_if(v.begin(),v.end(),bind2nd(myCom(),p));
if(pos!=v.end()){
cout<m_Name<m_Age<v;
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(4);
v.push_back(6);
v.push_back(22);
vector::iterator pos= adjacent_find(v.begin(),v.end());
if(pos!=v.end()){
cout<v;
for(int i=0;i<10;i++){
v.push_back(i);
}
if(binary_search(v.begin(),v.end(),4)){// bool
cout<=4;
}
};
void test06(){
vectorv;
for(int i=0;i<10;i++){
v.push_back(i);
}
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(4);
v.push_back(6);
v.push_back(6);
v.push_back(6);
v.push_back(6);
v.push_back(22);
int num=count(v.begin(),v.end(),6);
// int
cout<
(本ノートの内容はネット資源から整理し、削除する)