STLをいろいろ使ってみようと思います 第5回 algorithm(2)

今回はalgorithmの2回目です。
今日のサンプルで使ってるメソッドはどれも使ったこと無かったです。
普段の開発で、"あれ?これが出来る関数がalgorithmに入ってたはずだ!"ってなることが目標なので、この調子でどんどんやっていけたら良いですね。

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

int main() {
  std::vector<int> v;
  
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  v.push_back(5);
  v.push_back(3); // <= (*)
  v.push_back(4);
  v.push_back(5);
  v.push_back(6);

  std::vector<int> v2;
  v2.push_back(3);
  v2.push_back(4);
  v2.push_back(5);

  std::vector<int>::iterator it = 
    std::find_end(           // find_end()は
		  v.begin(), // ここから
		  v.end(),   // ここまでの範囲の中で
		  v2.begin(),// ここから
		  v2.end()); // ここまでのシーケンスが出てくる一番最後の
                             // 場所(上の(*)の場所)を指すイテレータを返す
  
  std::cout << "find_end()の例" << std::endl;
  for(; it != v.end(); ++it) 
    std::cout << *it << " ";
  std::cout << std::endl;

  std::vector<int> v3;
  v3.push_back(1);
  v3.push_back(5);
  v3.push_back(6);

  it = v.begin();

  std::cout << "find_first_of()の例" << std::endl;
  while(it != v.end()) {
    it = std::find_first_of(            // find_first_of()は
			    it,         // ここから
			    v.end(),    // ここまでの範囲の中で
			    v3.begin(), // ここから
			    v3.end());  // ここまでの範囲に含まれる最初の要素
                                        // を指すイテレータを返す
    if(it != v.end())
      std::cout << *(it++) << " ";
    
  } 
  std::cout << std::endl;

  std::vector<int> v4;
  v4.push_back(3);
  v4.push_back(2);
  v4.push_back(3); // <= 一回目に表示される
  v4.push_back(3);
  v4.push_back(4);
  v4.push_back(5); // <= 二回目に表示される
  v4.push_back(5);
  v4.push_back(3);

  it = v4.begin();
  std::cout << "adjacent_find()の例" << std::endl;
  while(it != v4.end()) {
    it = std::adjacent_find(          // adjacent_find()は
			    ++it,       // ここから
			    v4.end());// ここまでの範囲の中で
                                      // 同じ要素が連続する最初の位置をさす
                                      // イテレータを返す
    if(it != v4.end())
      std::cout << *it << " ";
   }
  std::cout << std::endl;

  std::cout << "count()の例" << std::endl;
  std::cout << "3は " 
            << std::count(            // count()は
			  v4.begin(), // ここから
			  v4.end(),   // ここまでの範囲に
			  3)          // これが何個あるかを返す
	    << "個あるよ" << std::endl;
  
  std::cout << "count_if()の例" << std::endl;
  std::cout << "奇数は "
            << std::count_if(           // count_if()は
			     v4.begin(),// ここから
			     v4.end(),  // ここまでの範囲に
			     [](int i){ // これを満たすのが何個あるかを返す
			       return i % 2 == 1;
			     })
            << "個あるよ" << std::endl;
  return 0;
}

結果

find_end()の例
3 4 5 6
find_first_of()の例
1 5 5 6
adjacent_find()の例
3 5
count()の例
3は 4個あるよ
count_if()の例
奇数は 6個あるよ