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

今回からalgorithmを数回に分けてやっていきたいと思います。

個人的にはfor_eachとラムダ式の組合せが大好きで、結構良く使うのですがsearchとかsort以外はそんなに使ったことがないのでいろいろ試していきたいと思います。

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

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);
  
  std::cout << "for_eachで各要素に2足したものを表示する" << std::endl;
  std::for_each(v.begin(), v.end(), 
		[](int i)->void{std::cout << i + 2 << " ";});
  std::cout << std::endl;

  std::cout << "元のベクトルは変わらない" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  std::transform(v.begin(), v.end(), v.begin(), 
		 [](int i){return i + 2;});
  std::cout << "transformだと元のベクトルを変更できる" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  std::vector<int> v2;
  v2.push_back(2);
  v2.push_back(4);
  v2.push_back(6);
  v2.push_back(8);
  v2.push_back(10);

  std::transform(v.begin(),     // 一つ目のコンテナの先頭
		 v.end(),       // 一つ目のコンテナの終わり
		 v2.begin(),    // 二つ目のコンテナの先頭
		 v.begin(),     // 結果を出力する先
		 [](int i, int j){return i * j;});

  std::cout << "2変数もとれるよ" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  std::vector<int>::iterator itr = std::find(v.begin(), v.end(), 30);
  if(itr != v.end()) // findの返り値がv.end()なら見つけられなかった
    std::cout << "30は" << itr - v.begin() << "番目の要素です" << std::endl;
  
  itr = std::find_if(v.begin(), v.end(), 
		     [](int i) -> bool{
		       int sqrt_int = static_cast<int>(sqrt(static_cast<double>(i)));
		       return sqrt_int * sqrt_int == i;});
  if(itr != v.end())
    std::cout << *itr << "は" << static_cast<int>(sqrt(*itr)) << "の2乗です" << std::endl;
    
  return 0;
}

結果

for_eachで各要素に2足したものを表示する
3 4 5 6 7
元のベクトルは変わらない
1 2 3 4 5
transformだと元のベクトルを変更できる
3 4 5 6 7
2変数もとれるよ
6 16 30 48 70
30は2番目の要素です
16は4の2乗です