Created
October 21, 2014 02:03
-
-
Save mitsu-ksgr/4e032e2acb0a057cd510 to your computer and use it in GitHub Desktop.
【C++】数値と単一文字のデリミタから構成されるバージョン名を比較するコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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