символ * для пользовательского типа - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть пользовательский тип.Допустим, это 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 с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...