|
VC++ ATL中实现的版本比较算法,包含版本号解析和比较逻辑
该实现支持任意长度的版本号比较(如1.0或1.0.0.1),采用分段比较策略,符合标准版本号比较规范。测试用例覆盖了主要边界情况
VersionUtils.h
- #pragma once
- #include <vector>
- #include <string>
- #include <algorithm>
- class CVersionUtils {
- public:
- static bool NeedUpgrade(LPCTSTR szCurrentVer, LPCTSTR szServerVer) {
- std::vector<int> vCurrent = ParseVersion(szCurrentVer);
- std::vector<int> vServer = ParseVersion(szServerVer);
-
- // 比较每个版本段
- for(size_t i = 0; i < std::min(vCurrent.size(), vServer.size()); ++i) {
- if(vServer[i] > vCurrent[i])
- return true;
- if(vServer[i] < vCurrent[i])
- return false;
- }
-
- // 如果前面都相同,比较长度(如1.0.0和1.0.0.1)
- return vServer.size() > vCurrent.size();
- }
- private:
- static std::vector<int> ParseVersion(LPCTSTR szVer) {
- std::vector<int> result;
- CString strVer(szVer);
- int pos = 0;
-
- CString token = strVer.Tokenize(_T("."), pos);
- while(!token.IsEmpty()) {
- result.push_back(_ttoi(token));
- token = strVer.Tokenize(_T("."), pos);
- }
-
- return result;
- }
- };
复制代码 VersionTest.cpp
- "VersionUtils.h"
- #include <iostream>
- int main() {
- // 测试用例
- struct TestCase {
- LPCTSTR current;
- LPCTSTR server;
- bool expected;
- } cases[] = {
- {_T("1.0.0.2"), _T("1.0.0.3"), true},
- {_T("2.1.5"), _T("2.1.4"), false},
- {_T("1.0"), _T("1.0.1"), true},
- {_T("3.2.1"), _T("3.2.1"), false}
- };
- for(const auto& test : cases) {
- bool actual = CVersionUtils::NeedUpgrade(test.current, test.server);
- std::wcout << L"Current:" << test.current << L" Server:" << test.server
- << L" Result:" << (actual ? L"Need" : L"NoNeed")
- << L" Test:" << (actual == test.expected ? L"PASS" : L"FAIL")
- << std::endl;
- }
- return 0;
- }
复制代码
|
|