Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

STL入門 第1回 ~algorithm編~

スポンサードリンク

f:id:fa11enprince:20200530122120j:plain

C++使うなら最低限STLくらいは知らないといけないだろうということで勉強中です。
STLくらいっていうけど結構ここから険しい道の入口なんですけどね…。
他の言語に比べて気持ち悪いシンタックスが増えるし、
どういうわけか覚えにくい……なんでだろ。
そんなわけでSTLのアルゴリズムの入門編です。
関数オブジェクトです。コールバック関数のように使えて、
アルゴリズムに渡します。
アルゴリズムにはtransformとかcount_ifとかremove_ifとかequalとかいろいろあります。
関数オブジェクトの定義はoperator()が定義(オーバーロード)されているオブジェクトのことです。
今回は1つの引数を受け取る単項関数オブジェクトのかわりにラムダを突っ込みます

C++11以前は単項関数オブジェクトを作るのに、
unary_functionというものを継承するということがあったみたいですが、
非推奨になったみたいです。継承なんかメンドクセ…なんでしょうね。

transform関数を使いました。詳細はここに書いてあります。
transform - C++ Reference

ソースコード

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <sstream>
#include <string>

int main() {
    using namespace std;
    vector<int> v;
    for (int i = 1; i <= 30; i++) {
        v.emplace_back(i);
    }
    cout << endl;
    vector<string> result;
    transform(v.begin(), v.end(), back_inserter(result), [](int i) -> string {
        if (i % 15 == 0) return "FizzBuzz";
        else if (i % 3 == 0) return "Fizz";
        else if (i % 5 == 0) return "Buzz";
        else return to_string(i);
    });
    for (string s : result) {
        cout << s << " ";
    }
    cout << endl;

    return 0;
}

実行結果

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz

なんかこのあたりかなり勉強すればいろいろ楽ができそう。
世界のナベアツさんって名前変えましたよね。そういえば。

第2回はこちら↓

こっちのほうがよっぽど第1回っぽい。