Skip to content

Instantly share code, notes, and snippets.

@mitsu-ksgr
Created October 21, 2014 02:03
Show Gist options
  • Save mitsu-ksgr/4e032e2acb0a057cd510 to your computer and use it in GitHub Desktop.
Save mitsu-ksgr/4e032e2acb0a057cd510 to your computer and use it in GitHub Desktop.
【C++】数値と単一文字のデリミタから構成されるバージョン名を比較するコード
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
/**
* @brief 文字列を指定したデリミタで分割します。
* @param str 分割元文字列
* @param delimiter デリミタ
* @return 分割した文字列のベクタ
*/
std::vector<std::string> splitString(const std::string &str, char delimiter)
{
std::istringstream iss(str);
std::vector<std::string> ret;
for(std::string temp;
std::getline(iss, temp, delimiter); ret.push_back(temp));
return ret;
}
/**
* @brief バージョン名を比較します.
* @par 比較
* 数値と単一区切り文字から構成されるバージョン名を比較します。
* 比較結果は、バージョン名1に対して、バージョン2の方が
* 大きい(1)か小さい(-1)か、もしくは同等(0)と判定されます。
* また、バージョン名1とバージョン名2の桁数が違う場合、
* 足りない側の該当桁数の値は0として比較されます。
* つまり、1.3.0と1.3は等しいと判定されます。
*
* @param version_name1 バージョン名1
* @param version_name2 バージョン名2
* @param delimiter 区切り文字(デフォルト値は'.')
* @return 0: 同じ
* @return 1: バージョン1の方が大きい
* @return -1: バージョン1の方が小さい
*/
int compareVersionName(
const std::string &version_name1, const std::string &version_name2,
char delimiter = '.')
{
std::vector<std::string> ver1 = splitString(version_name1, delimiter);
std::vector<std::string> ver2 = splitString(version_name2, delimiter);
int digit = std::max(ver1.size(), ver2.size());
int result = 0;
for(int i = 0; i < digit; ++i ) {
int v1 = (i < ver1.size()) ? std::atoi(ver1[i].c_str()) : 0;
int v2 = (i < ver2.size()) ? std::atoi(ver2[i].c_str()) : 0;
result = (v1 == v2) ? 0 : (v1 > v2) ? 1 : -1;
if(result) break;
}
return result;
}
int main() {
auto get_op = [](int r){ return r == 0 ? " = " : r == 1 ? " > " : " < "; };
std::string v1 = "1.0.1";
std::string v2 = "1.2.1";
std::cout << v1 << get_op(compareVersionName(v1, v2)) << v2 << std::endl;
v1 = "0.2.9"; v2 = "0.2.9";
std::cout << v1 << get_op(compareVersionName(v1, v2)) << v2 << std::endl;
v1 = "1.2.1"; v2 = "1.2.0";
std::cout << v1 << get_op(compareVersionName(v1, v2)) << v2 << std::endl;
v1 = "1.0"; v2 = "1.0.1";
std::cout << v1 << get_op(compareVersionName(v1, v2)) << v2 << std::endl;
v1 = "1.0.1.0.1"; v2 = "1.0.1";
std::cout << v1 << get_op(compareVersionName(v1, v2)) << v2 << std::endl;
v1 = "1,2,3"; v2 = "1,2,3,1";
std::cout << v1 << get_op(compareVersionName(v1, v2, ',')) << v2 << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment