Crawling SPOJ through cURL and C++
A few more possibilities to consider:

pre-compille your regular expressions

Compiling a regular expression is (potentially) a somewhat expensive operation. In this case, the regular expressions remain constant throughout the program, so you might as well compile them once, and use the compiled regular expression after that:

bool checkRegex(string &amp; str)
{
    static std::regex pattern{"^\\s{0,}&lt;td\\salign.{0,}$"};

    return regex_match (str , pattern);
}


use operator overloading where sensible

For example, your compare function:

bool compare (PROBLEM &amp; p1 , PROBLEM &amp; p2)
{
    return p1.users &lt; p2.users;
}


...really makes more sense as an overload of operator&lt;:

bool operator&lt;(PROBLEM &amp; p1 , PROBLEM &amp; p2)
{
    return p1.users &lt; p2.users;
}


const correctness

Taking the operator above a step further, we don't want x &lt; y to modify either x or y, so we should pass the operands by const reference:

bool operator&lt;(PROBLEM const &amp;p1 , PROBLEM const &amp;p2)
{
    return p1.users &lt; p2.users;
}


This way, when we sort our vector of Problem objects, we don't need to explicitly specify how to compare them:

sort(v.rbegin(), v.rend());


Use the force library, Luke

In addition to a command line utility, cURL is available as a library that you can use in your program. There's also a cURLpp library that provides a C++ wrapper around libcurl, which you may prefer. Either can help you write code that's quite a bit simpler and more readable.

Work with the library, not against it

Right now, you have (for example) a readFile to read the contents of a file into a vector of PROBLEM. That's not really how the standard library is meant to work though. To work optimally with it, you really just want to overload operator&gt;&gt; to read one PROBLEM from the file. Once you have that, you can (for example) use stream iterators to read from a file into a vector.

class Problem { 
    // ...

    friend std::istream &amp;operator&gt;&gt;(std::istream &amp;is, Problem &amp;p) { 
        // code to read one Problem from the stream goes here
        return is;
    }
};


Then we can initialize our vector from a pair of iterators:

std::ifstream in("input.txt");
std::vector&lt;Problem&gt; v{ std::istream_iterator&lt;Problem&gt;(in), {} };