大佬教程收集整理的这篇文章主要介绍了如何将 stl 容器保存在磁盘中?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 stl 容器,可以节省大量数据。@H_772_3@
例如定义为:@H_772_3@
len_a = 9
len_b = 7
我想要的是将它保存在一个文件中,然后下次我可以读取该文件以快速恢复它。@H_772_3@
我认为正常的方式,例如:@H_772_3@
std::unordered_map<std::string,std::vector<int32_t> > m; // there are 10 million data in this container
不起作用,因为它只保存指针。@H_772_3@
那么,如何将它保存在文件中并通过读取文件恢复它?@H_772_3@
选择文件格式,例如一个简单的列表,遍历您的容器并写入每个元素:@H_772_3@
for (const auto &el : m) {
file << el.first << '\n' << el.second.size() << '\n';
for (const auto &vecEl : el.second) {
file << vecEl << '\n';
}
}
然后你可以用@H_772_3@读取文件
std::string first;
std::size_t count;
while (std::getline(file,first) && file >> count) {
std::vector<int32_t> v(count);
for (auto &vecEl : v) {
file >> vecEl;
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
m[first] = v;
}
这只是一个草图。您可能需要添加错误检查。@H_772_3@ ,
鉴于您不热衷于使用 boost,最省力、最低可重用性的选项类似于:@H_772_3@
// some support macros for easy error detection/handling...
#define FATAL(MSG) \
do { \
std::cerr << "FATAL ERROR at line " << __LINE__ << ":\n" \
" " << MSG << '\n'; \
exit(EXIT_FAILURE); \
} while (false)
#define ASSERT(X,MSG) \
do { \
if (X) break; \
FATAL("ASSERT(" #X ") FAILED; " << MSG); \
} while (false)
// output your container to disk...
if (std::ofstream out{filename}) {
for (auto& [key,value] : m) {
out << key.size() << ' ';
out.write(key.data(),key.size();
out << ' ' << value.size();
for (auto& i : values)
out << ' ' << i;
out >> '\n';
}
ASSERT(out,"failed while wriTing to " << fileName);
}
else
FATAL("failed to create " << fileName);
这只是创建一个包含如下行的文件:@H_772_3@
13 A 13 char str 5 1 2 3 4 5
前导 13 意味着您在解析字符串之前知道字符串中有多少个字符,这为我们省去了提出一些转义和终止符约定的麻烦,或者没有一个约定的风险(例如假设字符串没有嵌入换行符通常是有风险的)。第一个“5”表示数组长度,只需要加快加载速度,因为它可以让您预先保留足够的内存,这可能比使用 .push_BACk
并且在加载数组期间必须 resize
更快.@H_772_3@
读取文件然后变成:@H_772_3@
if (std::ifstream in{filename}) {
size_t len;
while (in >> len) {
std::string key;
key.resize(len);
ASSERT(in.read(key.data(),len));
ASSERT(in >> len);
std::vector<int32_t> v;
v.reserve(len);
while (len--) {
ASSERT(in >> num);
v.push_BACk(num);
}
}
ASSERT(out.eof(),"failed to parse String size");
m[std::move(key)] = std::move(v);
}
else
FATAL("failed to open " << fileName);
我还没有测试过这个,所以根据需要使用/test/debug....@H_772_3@
以上是大佬教程为你收集整理的如何将 stl 容器保存在磁盘中?全部内容,希望文章能够帮你解决如何将 stl 容器保存在磁盘中?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。