gpt4 book ai didi

c++ - 如何存储/加载大型 C++ 容器

转载 作者:太空狗 更新时间:2023-10-29 21:33:39 26 4
gpt4 key购买 nike

我想知道如何存储 C++ 容器以实现高效加载,例如如何存储非常大的整数 vector 。我知道我可以将它们保存在一个文件中,并从该数据中创建新的 vector

#include <fstream>
#include <vector>

int main()
{
vector<int> data = {1, 2, 3, 4, 5}; // some elements
std::ifstream file(path);
for (const auto &c : data)
file << c << " ";
return 0;
}

但是如果我想保存 1 GB 的数据,每次从文件加载它都需要 loooooooooong 的时间。那么有没有一种方法可以存储这种数据,以便快速加载而不需要永远,如果可能的话我也想以这种方式存储我自己的类。

最佳答案

std::vector 存储在连续的内存块中。如果您想将数据从 vector 存储/加载到文件中,您应该能够执行类似的操作。

std::string filename{ "test.dat" };
std::vector<int> vec_source = { 1, 2, 3, 4, 5 }; // some elements

// Save to file
std::ofstream OutFile;
OutFile.open(filename, std::ofstream::out | std::ofstream::binary);
OutFile.write(reinterpret_cast<char*>(vec_source.data()), vec_source.size() * sizeof(int));
OutFile.close();

// Prepare
std::vector<int> vec_target;
vec_target.resize(vec_source.size());

// Load from file
std::ifstream InFile;
InFile.open(filename, std::ofstream::in| std::ofstream::binary);
InFile.read(reinterpret_cast<char*>(vec_target.data()), vec_target.size() * sizeof(int));
InFile.close();

请参阅此处的工作示例: https://wandbox.org/permlink/oQuwXxU8q230FaJC

[编辑]

一些注意事项和限制:

注意 1:如果您打算做更多,那么只需保存/加载整个数组。像改变数据和只存储改变的你应该考虑一个更好的方法(比如把数据分成 block ,单独保存每个 block )

注意 2:此方法仅适用于使用连续内存块的容器,如 std::vectorstd::arraystd::string。它肯定不适用于 std::liststd::map

注释 3:在这篇博文的评论中,@DavidSchwartz 和@Acorn 进行了有趣的讨论。只有在从文件存储和加载数据时平台的字节序不变且相同时,此代码示例才能正常工作。如果平台在运行中改变其字节序或混合平台,它肯定不会工作!。

关于c++ - 如何存储/加载大型 C++ 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50550319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com