イネマルのプログラミング備忘録

だいたい付箋。一口サイズのメモ帳

C++ バージョン番号を比較する方法

はじめに

複数の値から形成されているバージョン番号などの値を比較する際、
一つずつ比較するのは、手間ですが、std::lexicographical_compare を使用すると、一行で書けます。
なお、std::tuple でより短くスマートに実装できるので、追記要参照。

実装

#include <algorithm>  // lexicographical_compare
#include <iostream>      // cout
#include <cstdint>       // int32_t
#include <array>     // array

// バージョン比較用共用体
union CompVersion {
    struct {
        int32_t minor;
        int32_t major;
        int32_t revision;
        int32_t build;
    };
    std::array<int32_t, 4> data;
};

int main()
{
    // 適当なバージョンデータ
    CompVersion appA = { 1, 0, 100, 2 };
    CompVersion appB = { 2, 0, 100, 3 };

    // 比較(appA < appB)
    bool result = std::lexicographical_compare(appA.data.begin(), appA.data.end(), appB.data.begin(), appB.data.end());

    // 結果
    if (result) {
        std::cout << "appAの方が古い" << std::endl;
    }
    else {
        std::cout << "appBの方が古い" << std::endl;
    }

    system("pause");
    return 0;
}

あとがき

ショートコーディングとしては、かなり有用なので覚書。
元ネタは、下記から。
stackoverflow.com

追記

この記事を公開直後に、バンビちゃんさんに高速カウンターをいただきました。
std::tuple を使用すると、もっとスマートに実装できるとのこと。
tuple便利!