Reducing compilation time std :: regex in C ++

I use std::regex r("-?[0-9]*(.[0-9]+)?(e-?[0-9]+)?")to check numbers (ints / fixed point / floating point). MWE below:

#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <algorithm>

using namespace std;

bool isNumber(string s) {
  // can ignore all whitespace
  s.erase(remove(s.begin(), s.end(), ' '), s.end());
  std::regex r("-?[0-9]*(.[0-9]+)?(e-?[0-9]+)?");
  return regex_match(s, r);
}

int main() {
  std::vector<string> test{
    "3", "-3", // ints
      "1 3", " 13", " 1 3 ", // weird spacing
      "0.1", "-100.123123", "1000.12312", // fixed point
      "1e5", "1e-5", "1.5e-10", "1a.512e4", // floating point
      "a", "1a", "baaa", "1a", // invalid
      "1e--5", "1e-", //invalid
      };

  for (auto t : test) {
    cout.width(20); cout << t << " " << isNumber(t) << endl;
  }

  return 0;
}

I noticed that the compilation time is quite long compared to what I expected:

  • gcc 5.4 -O0 -std=c++11, 2.3 seconds
  • gcc 5.4 -O2 -std=c++11, 3.4 seconds
  • clang++ 3.8 -O0 -std=c++11, 1.8 seconds
  • clang++ 3.8 -O2 -std=c++11, 3.7 seconds

I use this for an online application of a judge who has time at the compilation stage.

So, instructive questions:

  • Why is compilation time so long? I get the impression that when using regular expressions in vim / emacs / grep / ack / ag, etc. (On the same computer) compilation really takes a lot less.
  • Is there a way to reduce the regex compilation time in C ++?
+4
source share
1

, , , : -?[0-9]*(\.[0-9]+)?(e-?[0-9]+)? , , , : "1 3" ( , 2 .) , " 2 " .

istringstream , :

bool isNumber(const string& s) {
    long double t;
    istringstream r(s);

    return r >> t >> ws && r.eof();
}

Live Example

+1

Source: https://habr.com/ru/post/1667816/


All Articles