Мне нужно проанализировать несколько строк в стиле C (около 500 тыс.), Содержащих 4 числа с плавающей запятой, разделенные одним пробелом. Ниже приведен пример одной строки:Анализ строки чисел
«90292 5879 5879 89042,2576»
мне нужно хранить эти числа в двух структур, представляющих две точки. Учитывая, что строка может быть изменена при анализе, и что 99,99% от числа чисел являются целыми без знака, какой самый быстрый способ сделать это?
Ниже моя текущая реализация:
#include <iostream>
#include <cassert>
#include <chrono>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
using namespace chrono;
struct PointF
{
float x;
float y;
};
void parse_points(char* points, PointF& p1, PointF& p2)
{
auto start = points;
const auto end = start + strlen(points);
// p1.x
start = std::find(start, end, ' ');
assert(start < end);
*start = '\0';
p1.x = static_cast<float>(atof(points));
points = start + 1;
// p1.y
start = std::find(start, end, ' ');
assert(start < end);
*start = '\0';
p1.y = static_cast<float>(atof(points));
points = start + 1;
// p2.x
start = std::find(start, end, ' ');
assert(start < end);
*start = '\0';
p2.x = static_cast<float>(atof(points));
points = start + 1;
// p2.y
start = std::find(start, end, ' ');
assert(start == end);
p2.y = static_cast<float>(atof(points));
}
int main()
{
const auto n = 500000;
char points_str[] = "90292 5879 89042.2576 5879";
PointF p1, p2;
vector<string> data(n);
for (auto& s : data)
s.assign(points_str);
const auto t0 = system_clock::now();
for (auto i = 0; i < n; i++)
parse_points(const_cast<char*>(data[i].c_str()), p1, p2);
const auto t1 = system_clock::now();
const auto elapsed = duration_cast<milliseconds>(t1 - t0).count();
cout << "Elapsed: " << elapsed << " ms" << endl;
cin.get();
return 0;
}
Я думаю, 'boost :: lexical_cast' быстрее, чем' atof'. –
@sorosh_sabz на самом деле более чем в 8 раз медленнее .... – Nick
Слишком много вопросов парсинга, по крайней мере, вы можете выполнить поиск в первую очередь. Попробуйте это: ["stackoverflow C++ read file space separate float"] (https://www.google.com/search?q=stackoverflow+c%2B%2B+read+file+space+separated+float&ie=utf-8&oe = utf-8) –