Compare versions as strings

后端 未结 4 1935
一整个雨季
一整个雨季 2020-12-16 05:20

Comparing version numbers as strings is not so easy...
\"1.0.0.9\" > \"1.0.0.10\", but it\'s not correct.
The obvious way to do it properly is to parse these strings

4条回答
  •  感动是毒
    2020-12-16 06:03

    I would create a version class.
    Then it is simple to define the comparison operator for the version class.

    #include 
    #include 
    #include 
    #include 
    
    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(versionStream),
                            std::istream_iterator(),
                            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    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";
        }
    }
    

提交回复
热议问题