Как напрямую прочитать огромный кусок памяти в std :: vector?

У меня есть огромный непрерывный массив x что я fread из файла.

Как мне бросить этот кусок в std::vector<>? Другими словами, я предпочитаю, чтобы результат был в std::vector<> а не массив, но я хочу, чтобы результирующий код C ++ был таким же эффективным, как и эта простая C-версия, которая помещает кусок прямо в массив.

Из поисков вокруг, я думаю, что мне, возможно, придется использовать новое место размещения в некоторой форме, но я не уверен в последовательности вызовов и проблем с владением. Кроме того, мне нужно беспокоиться о проблемах выравнивания?

Я проверяю с T = unsigned, но я ожидаю, что разумное решение будет работать для любой структуры POD.

using T = unsigned;
FILE* fp = fopen( outfile.c_str(), "r" );
T* x = new T[big_n];
fread( x, sizeof(T), big_n, fp );

// how do I get x into std::vector<T> v
// without calling a gazillion push_backs() or copies ?!?

delete[] x;
fclose( fp );

7

Решение

Вы используете std::vector конструктор который устанавливает размер вектора, и использовать std::vector::data получить указатель на выделенную память.

Хранение с вашим использованием fread:

std::vector<T> x(big_n);
fread(x.data(), sizeof(T), big_n, fp);

Как отмечают другие, используя fread если тип T это не Тип POD скорее всего не будет работать. Затем вы можете использовать потоки C ++ и std::istreambuf_iterator прочитать файл в вектор. Однако это имеет тот недостаток, что он перебирает все элементы в файле, и если big_n настолько велик, насколько это звучит, тогда это может быть проблемой производительности.


Однако, если файл действительно большой, я рекомендую использовать отображение памяти прочитать файл.

10

Другие решения

Это будет читать файл в вектор с помощью

#include <vector>
#include <fstream>
#include<iterator>
// ...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<unsigned char> fileContents((std::istreambuf_iterator<unsigned char>(testFile)),
std::istreambuf_iterator<unsigned char>());

Этот ответ прибывает из предыдущего ответа: https://stackoverflow.com/a/4761779/942596

0

По вопросам рекламы [email protected]