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便利!
さっきのやつをささっと
— バンビちゃん@実際いません (@pink_bangbi) March 5, 2018
C++ で std::tuple を使ってバージョン番号を比較する - Secret Garden(Instrumental) https://t.co/nYr0xrfS8z
std::tuple を使えば1発で… https://t.co/HVV3qwq1pd https://t.co/kalcnzr1jd
— バンビちゃん@実際いません (@pink_bangbi) March 5, 2018