一般的なアルゴリズムライブラリの概要


一般的なアルゴリズムは何ですか?通俗的に言えば、この計算方法はデータタイプに依存しないということです.例えば、ある要素を検索して、vectorを調べてもいいし、listを調べてもいいし、配列を調べてもいいです.これらのアルゴリズムの入力は典型的には一対のローズマリーでアルゴリズムの役割の範囲を示している.以下の例はfind関数とcount関数を使用することを示している.
	//  12  
	vector<int> ival;
	for(int i = 0;i < 6;++i)
	{
		ival.push_back(i);
		ival.push_back(i);
	}

	
	//find      
	cout<<"please enter the number to search: "<<endl;
	int searchItem;
	cin>>searchItem;
	vector<int>::iterator iter = find(ival.begin(),ival.end(),searchItem);
	//    ,            ,         
	if(iter != ival.end())
		cout<<*iter<<"is in the vctor"<<endl;
	else
		cout<<"can't find the vaule!"<<endl;

	//count      
	int times = count(ival.begin(),ival.end(),searchItem);
	cout<<searchItem<<" occurs "<<times<<" times "<<endl;
 
アルゴリズムは容器自身の操作を実行しないということは、私たちはival.findを使用してこの関数を使用しないということです.この使い方は私の意志に合致しているように見えますが、忘れてはいけません.データベースを計算するのは一般的で、データのタイプに依存しないので、アルゴリズムはある種類の容器を実行するのではありません.より重要な点は、これは通常のアルゴリズムが容器のサイズを変更しないことを意味する.
 
アルゴリズムライブラリによって定義されたアルゴリズムは多いが、基本的には、アルゴリズムによって要素を操作して分類することができる.元素を読むかどうか、元素を書くかどうか、元素を並べ替えるかどうか.
読み取り専用アルゴリズムについては、簡単な例を挙げて、コンテナ内のすべての数字に対して合計を求めます.
 
	//accumulate      :           
	int sum = accumulate(ival.begin(),ival.end(),100);
	cout<<"sum+100 = "<<sum<<endl;
なお、accumulateアルゴリズムでは、ローズマリーが指定するタイプは、初期値と一致しなければならない.
アルゴリズムを書くには、書き込みの範囲が少なくとも容器の範囲内であることに注意しなければなりません.
例えば、fill関数:
	//fill  ,           0
	cout<<"enter the number you want to fill"<<endl;
	int fillNumber;
	cin>>fillNumber;
	fill(ival.begin(),--ival.end(),fillNumber);
	for(vector<int>::iterator it = ival.begin();it != ival.end();++it)
		cout<<*it<<"\t";

	cout<<endl;
fill_n関数:書き込みの固定数:
	//fill_n  : 3     5
	cout<<"first 3 number will be replaced by 5"<<endl;
	fill_n(ival.begin(),3,5);
	for(vector<int>::iterator it = ival.begin();it != ival.end();++it)
		cout<<*it<<"\t";
	cout<<endl;
 
越境防止のために、ローズマリーback_を挿入することができます.inserter、このようにfill_n関数は、追加された数字を自動的にivalの末尾に追加します.前に述べましたが、アルゴリズムは直接容器のサイズを変えません.しかしここで使っているのはローズマリーの修正です.だから矛盾していません.
	//       :20         
	cout<<"append 20 10s to the vctor: "<<endl;
	fill_n(back_inserter(ival),20,10);
	for(vector<int>::iterator it = ival.begin();it != ival.end();++it)
		cout<<*it<<"\t";
	cout<<endl;
並べ替えアルゴリズムについては、まず例を見ます.
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;

//      
bool isShorter(const string &s1,const string &s2)
{
	return s1.size()<s2.size();
}

bool GT6(const string &s)
{
	return s.size()>6;
}


int main()
{
	cout<<"please enter some words"<<endl;
	string word;
	vector<string> words;
	while(cin>>word)
		words.push_back(word);

	cout<<endl;
	//sort   words      
	sort(words.begin(),words.end());
	//    
	for(vector<string>::iterator iter = words.begin();iter != words.end();++iter)
		cout<<*iter<<"\t";

	//unique                    ,       ,             
	vector<string> ::iterator end_unique = unique(words.begin(),words.end());
	//       
	cout<<"without repeat words: "<<endl;
	words.erase(end_unique,words.end());
	for(vector<string>::iterator iter = words.begin();iter != words.end();++iter)
		cout<<*iter<<"\t";
	cout<<endl;

	//          
	cout<<"is shorter"<<endl;
	stable_sort(words.begin(),words.end(),isShorter);
	for(vector<string>::iterator iter = words.begin();iter != words.end();++iter)
		cout<<*iter<<"\t";
	cout<<endl;

	vector<string>::size_type wc = 0;
	//  count_if
	//wc = count_if(words.begin(),words.end(),GT6);

	//  find_if
	vector<string>::iterator it = words.begin();

	while((it = find_if(words.begin(),words.end(),GT6)) != words.end())
	{
		++it;
		++wc;
	}


	cout<<wc<<" "<<"6 words or longer"<<endl;
	return 0;
}
 
このプログラムは入力文字の中で6文字より大きい単語の数を統計します.
その中でsortは辞書の順に並べられています.uniqueは容器の中で重複していない単語を探して、容器の前に並べて、繰り返しています.最初の重複要素を指すディケンサを返します.sortは述語の関数を持っています.自分の順番を定義することができます.count_if検出によって、述語関数は本物の容器要素の個数であり、同じ原理でfind_もある.ifは、最初の述語関数を0ではないシフタに戻し、この2つの方法は、6文字以上の単語を統計する目標を達成することができる.
計算法の倉庫の中のものはとても多くて、ここですべての関数に対してすべて実例の説明をすることができなくて、しかしこれらの計算方法の命名と使用規則はすべてとても規則的で、そのために多くの時私達は“望文生義”がいくつかの計算方法の作用を出すことができます.
法庫の関数は主に以下の4つの中から使用されます.