У меня есть пользовательский тип.Допустим, это 3D точечный тип с интенсивностью, поэтому он будет выглядеть следующим образом:
struct Point{
public:
double x,y,z;
double intensity;
//Imagine a constructor or everything we need for such a class here
};
и другой класс, который использует вектор этой точки.
class Whatever{
//...
public:
std::vector<Point> myPts;
//...
};
Я бы хотелчтобы иметь возможность создать этот вектор из файла.Это означает, что у меня есть файл, подобный следующему:
X1 Y1 Z1 I1
X2 Y2 Z2 I2
X3 Y3 Z3 I3
....
Xn Yn Zn In
И я хотел бы найти быстрый метод для разделения каждой линии и построения точки по линиям и построения моего вектора.Поскольку это операция, которую мне придется много делать, я ищу самый быстрый способ.
Основным решением было бы прочитать файл построчно, преобразовать в поток строк и создать из этого потока строк:
while(std::getline(file, line)){
std::istringstream iss(line);
Point pt;
iss >> pt.x >> pt.y >> pt.z >> pt.intensity;
vector.add(pt);
}
Но это слишком много времени.Таким образом, вторым методом будет считывание файла (всего или части файла) в буфере и форматирование буфера для создания вектора из него.Используя файл с отображенной памятью, я могу быстро читать в буфер, но как отформатировать буфер для создания моих точек без использования потока строк, который я считаю медленным?
РЕДАКТИРОВАТЬ: я использовал этот код:
std::clock_t begin = clock();
std::clock_t loadIntoFile, loadInVec;
std::ifstream file(filename);
if (file) {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
loadIntoFile = clock();
while (!buffer.eof()) {
Point pt = Point();
buffer >> pt.x >> pt.y >> pt.z >> pt.intens >> pt.r >> pt.g >> pt.b;
pts.push_back(pt);
}
loadInVec = clock();
}
std::cout << "file size" << pts.size() << std::endl;
std::cout << "load into file : " << (loadIntoFile - begin) / (double)CLOCKS_PER_SEC << std::endl;
std::cout << "load into vec : " << (loadInVec - loadIntoFile) / (double)CLOCKS_PER_SEC << std::endl;
И результат:
file size : 7756849
load into file : 2.619
load into vec : 31.532
EDIT2: После удаления буфера потока строки у меня было время 34.604 с И после изменения push_back
на emplace_back
34.023 с