while (getline(in,line)) { // проверка строки данных
smatch matches;
if (!regex_match(line, matches, row))
error("bad line", lineno);
// проверка строки:
int field1 = from_string<int>(matches[1]);
int field2 = from_string<int>(matches[2]);
int field3 = from_string<int>(matches[3]);
// ...
}
Синтаксис
регулярных выражений основан на символах, имеющих особый смысл (см. главу 23).
Некоторые классы символов поддерживаются аббревиатурами.
Б.9. Численные методы
В стандартной библиотеке языка C++ содержатся основные строительные конструкции для математических (научных, инженерных и т.д.) вычислений.
Б.9.1. Предельные значения
Каждая реализация языка C++ определяет свойства встроенных типов, чтобы программисты могли использовать эти средства для проверки предельных значений, установки предохранителей и т.д.
В заголовке
<limits>
определен класс
numeric_limits <T>
для каждого встроенного или библиотечного типа
T
. Кроме того, программист может определить класс
numeric_limits<X>
для пользовательского числового типа
X
. Рассмотрим пример.
class numeric_limits<float> {
public:
static const bool is_specialized = true;
static const int radix = 2; // основание системы счисления
// (в данном случае двоичная)
static const int digits = 24; // количество цифр в мантиссе
// в текущей системе счисления
static const int digits10 = 6; // количество десятичных цифр
// в мантиссе
static const bool is_signed = true;
static const bool is_integer = false;
static const bool is_exact = false;
static float min { return 1.17549435E–38F; } // пример
static float max { return 3.40282347E+38F; } // пример
static float epsilon { return 1.19209290E–07F; } // пример
static float round_error { return 0.5F; } // пример
static float infinity { return /* какое-то значение */; }
static float quiet_NaN { return /*
какое-то значение */; }
static float signaling_NaN { return /* какое-то значение */; }