如何直接将一大块内存读入std::vector
How to directly read a huge chunk of memory into 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 );
您使用std::vector
构造函数设置vector的大小,并使用std::vector::data
获取指向已分配内存的指针。
使用fread
:
std::vector<T> x(big_n);
fread(x.data(), sizeof(T), big_n, fp);
正如其他人所指出的,如果类型T
不是POD类型,那么使用fread
很可能不起作用。然后可以使用c++流和std::istreambuf_iterator
将文件读入vector。然而,这有一个缺点,它循环遍历文件中的所有项,如果big_n
像听起来那么大,那么这可能是一个性能问题。
但是,如果文件确实很大,我更建议使用内存映射来读取文件
这将使用
将文件读入vector#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
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 使 std::vector 分配对齐内存的现代方法
- std::unordered_map析构函数不释放内存?
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 在共享缓冲区内存中创建 ::std::string 对象
- 内存未释放 std::list<std::shared_ptr<std::string>> C++
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 如何防止使用 std::shared_ptr 的代码中的内存泄漏
- C++ 中 std::vector 的内存问题
- std::set 是否将对象连续存储在内存中?
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- vector是否为std::移动的对象连续分配内存
- Valgrind 在 std::make_unique 中显示内存泄漏
- std::initializer_list 堆是否分配内存?
- std::unordered_set 中的元素如何存储在C++内存中?