버전 번호를 문자열로 비교하는 것은 쉽지 않습니다 ...
"1.0.0.9"> "1.0.0.10",하지만 올바르지 않습니다.
올바르게 수행하는 확실한 방법은 이러한 문자열을 구문 분석하고 숫자로 변환하고 숫자로 비교하는 것입니다. "우아하게"또 다른 방법이 있습니까? 예를 들어, boost :: string_algo ...문자열을 버전으로 비교
답변
단지 구문 분석보다 더 우아 할 수는 없습니다.하지만 을으로 지정하십시오. 이미 표준 라이브러리 기능을 사용하십시오. 당신이 오류 검사가 필요하지 않습니다 가정 : 더 복잡
void Parse(int result[4], const std::string& input)
{
std::istringstream parser(input);
parser >> result[0];
for(int idx = 1; idx < 4; idx++)
{
parser.get(); //Skip period
parser >> result[idx];
}
}
bool LessThanVersion(const std::string& a,const std::string& b)
{
int parsedA[4], parsedB[4];
Parse(parsedA, a);
Parse(parsedB, b);
return std::lexicographical_compare(parsedA, parsedA + 4, parsedB, parsedB + 4);
}
뭐든지 유지하기 어렵게 될 것이다 당신의 시간을 가치가 아닙니다.
+1 : 깔끔한 STL 사용. 'std :: lexicographical_compare'에 오타가 있습니다. – Johnsyweb
알고리즘이 좋습니다. 나는 그것을'class Version {버전 (std :: string const &); bool 연산자 <(버전 const & rhs) const; };'. 예를 들어'std :: set
@Johnsyweb : 오타를 찾아 주셔서 감사합니다. @ MSalters : 나는 동의한다. 제작을 위해 이것을 사용하는 것은 아닙니다. OP가 사용해야한다고 생각하는 알고리즘을 보여 주려고했습니다. –
나는 버전 클래스를 만들 것이다.
그러면 버전 클래스에 대한 비교 연산자를 정의하는 것이 간단합니다.
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
class Version
{
// An internal utility structure just used to make the std::copy in the constructor easy to write.
struct VersionDigit
{
int value;
operator int() const {return value;}
};
friend std::istream& operator>>(std::istream& str, Version::VersionDigit& digit);
public:
Version(std::string const& versionStr)
{
// To Make processing easier in VersionDigit prepend a '.'
std::stringstream versionStream(std::string(".") + versionStr);
// Copy all parts of the version number into the version Info vector.
std::copy( std::istream_iterator<VersionDigit>(versionStream),
std::istream_iterator<VersionDigit>(),
std::back_inserter(versionInfo)
);
}
// Test if two version numbers are the same.
bool operator<(Version const& rhs) const
{
return std::lexicographical_compare(versionInfo.begin(), versionInfo.end(), rhs.versionInfo.begin(), rhs.versionInfo.end());
}
private:
std::vector<int> versionInfo;
};
// Read a single digit from the version.
std::istream& operator>>(std::istream& str, Version::VersionDigit& digit)
{
str.get();
str >> digit.value;
return str;
}
int main()
{
Version v1("10.0.0.9");
Version v2("10.0.0.10");
if (v1 < v2)
{
std::cout << "Version 1 Smaller\n";
}
else
{
std::cout << "Fail\n";
}
}
'std :: copy' 대신'std :: vector
수업을 좀 더 완벽하게 해주는 약간의 제안. _boost_가 사용 가능하다면 자동적으로'operator>','operator <=','operator> ='를 추가하기 위해'boost :: less_than_comparable' (https://theboostcpplibraries.com/boost.operators) 이것은 모두 연산자'로 표현됩니다. 또한 유용한 것은'operator =='이고'boost :: equality_comparable'에서 파생되어'operator! ='를 제공하는 것입니다. – zett42
@ zett42. 그럴 필요 없어. 비교 연산자를 추가하려면'using namespace std :: rel_ops'를 추가하면됩니다. [참조] (http://www.cplusplus.com/reference/utility/rel_ops/) –
int VersionParser(char* version1, char* version2) {
int a1,b1, ret;
int a = strlen(version1);
int b = strlen(version2);
if (b>a) a=b;
for (int i=0;i<a;i++) {
a1 += version1[i];
b1 += version2[i];
}
if (b1>a1) ret = 1 ; // second version is fresher
else if (b1==a1) ret=-1; // versions is equal
else ret = 0; // first version is fresher
return ret;
}
- 1. PHP에서 문자열을 문자열로 비교
- 2. 문자열을 regEx 와일드 카드 값과 비교
- 3. 두 문자열을 "=="로 비교 : 언제 작동합니까?
- 4. preg_match에서 발견 된 여러 문자열을 MD5 버전으로 대체하는 방법은 무엇입니까?
- 5. 이전 XCode 버전으로 되돌리려면?
- 6. xcode 3.2.3 버전으로 업그레이드
- 7. 버전으로 MVC 자바 스크립트는
- 8. 서브 버전으로 라이브 커밋
- 9. 서브 버전으로 커밋시 빌드
- 10. 앱을 새로운 버전으로 구입
- 11. FileLoadException dll의 새 버전으로
- 12. 비교 C
- 13. 비교
- 14. 비교
- 15. ruby 이진 문자열 비교
- 16. C에서 문자열 비교 #
- 17. 문자열 비교 C#
- 18. PostgreSQL utf8 문자 비교
- 19. Nutch Vs Heritrix 비교 비교
- 20. Umbraco 3.0에서 최신 버전으로 이전
- 21. 코어 데이터의 여러 버전으로 마이그레이션
- 22. 라이트 버전으로 프로젝트를 실행하는 방법
- 23. 버전으로 NHibernate와 sql timestamp 컬럼
- 24. 엄지 손가락 : 새 버전으로 업그레이드
- 25. SVN - 트렁크를 이전 버전으로 변경합니다.
- 26. 이전 프로젝트를 최신 버전으로 변경
- 27. 명령 줄에서 최신 버전으로 업데이트
- 28. .NET1.1에서 .NET3.5 버전으로 마이그레이션하는 방법
- 29. 레일즈는 show.html.erb의 PDF 버전으로 링크합니다
- 30. 프로젝트를 최신 버전으로 유지하기위한 기술
는 http://stackoverflow.com/a/34484221/1318830가 응답하고 내가 그 버전 클래스 대신 문자열을 만들 제안 질문 –
을 발견했다. '1.0.0.9 beta '가 필요할 수도 있습니다. 그것은 단순한 정수 비교가 아닙니다. –
관심있는 사람들을 위해이 질문의 C 버전 : [c의 버전 번호 비교] (http://stackoverflow.com/questions/15057010) – hippietrail