У меня есть огромный непрерывный массив 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 );
Вы используете 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
настолько велик, насколько это звучит, тогда это может быть проблемой производительности.
Однако, если файл действительно большой, я рекомендую использовать отображение памяти прочитать файл.
Это будет читать файл в вектор с помощью
#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