lower_boundとupper_boundで区間抽出

lower_bound()upper_bound()でこんなことができたんだなーと発見できて楽しかったので、時間で区間を指定して抽出するのをやってみました。

簡易的なBoost.Interval Containerとして使えていいですね。

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

int main()
{
    std::vector<std::string> times = {
        "2018/12/31 00:00",
        "2019/01/01 00:01",
        "2019/01/01 01:15",
        "2019/01/01 03:30",
        "2019/01/01 08:23",
        "2019/01/01 10:50",
        "2019/01/01 13:20",
        "2019/01/01 15:30",
        "2019/01/01 18:00",
        "2019/01/03 23:59",
    };

    // 日付2019/01/01の午前中だけ取り出す
    auto first = std::lower_bound(times.begin(), times.end(), "2019/01/01 00:00");
    auto last  = std::upper_bound(times.begin(), times.end(), "2019/01/01 12:00");

    for (; first != last; ++first) {
        std::cout << *first << std::endl;
    }
}

出力:

2019/01/01 00:01
2019/01/01 01:15
2019/01/01 03:30
2019/01/01 08:23
2019/01/01 10:50

補足ですが、UTF-8とかの文字コードを指定しなくてもC++の規格で文字'0'から'9'までは順序が規定されているので、文字列の辞書順比較で日時の大小が決められます。月をJan、Febとかにしたら意図した動作にはなりません。数字以外の区切り文字とかが共通ならいけるので、「2019年01月01日」とかなら大丈夫です。月と日が2桁ゼロ埋めで揃えないといけない縛りとかはあります。

境界値のお試し。

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

int main()
{
    std::vector<std::string> times = {
        "2018/12/31 00:00",
        "2019/01/01 00:00",
        "2019/01/01 00:01",
        "2019/01/01 01:15",
        "2019/01/01 03:30",
        "2019/01/01 08:23",
        "2019/01/01 10:50",
        "2019/01/01 11:59",
        "2019/01/01 12:00",
        "2019/01/01 13:20",
        "2019/01/01 15:30",
        "2019/01/01 18:00",
        "2019/01/03 23:59",
    };

    // 日付2019/01/01の午前中だけ取り出す
    auto first = std::lower_bound(times.begin(), times.end(), "2019/01/01 00:00");
    auto last  = std::upper_bound(times.begin(), times.end(), "2019/01/01 12:00");

    for (; first != last; ++first) {
        std::cout << *first << std::endl;
    }
}

出力:

2019/01/01 00:00
2019/01/01 00:01
2019/01/01 01:15
2019/01/01 03:30
2019/01/01 08:23
2019/01/01 10:50
2019/01/01 11:59
2019/01/01 12:00