Как наиболее быстро сохранить/прочитать std::unordered_map в файл
Собственно, вопрос в заголовке:
Как наиболее быстро сохранить/прочитать std::unordered_map в файл
Значение и ключ --> строки.
P.S. в мапе не больше 1000 записей
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
"Защиту от дурака" - все проверки, что файл открылся, существует, запись прошла и так далее - не писал, это уж сами допишите. Главное - файл открывать в бинарном режиме.
#include <string>
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;
ostream& outStr(ostream& out, const string& s)
{
size_t l = s.size();
out.write((char*)&l,sizeof(l));
out.write(s.c_str(),l);
return out;
}
istream& inStr(istream& in, string& s)
{
size_t l;
in.read((char*)&l,sizeof(l));
s = string(l,' ');
in.read(s.data(),l);
return in;
}
void map2file(const unordered_map<string,string>& m, ostream& out_file)
{
size_t l = m.size();
out_file.write((char*)&l,sizeof(l));
for(auto& p: m)
{
outStr(out_file,p.first);
outStr(out_file,p.second);
}
}
void file2map(istream& in_file, unordered_map<string,string>& m)
{
size_t l;
in_file.read((char*)&l,sizeof(l));
for(int i = 0; i < l; ++i)
{
string key;
inStr(in_file,key);
inStr(in_file,m[key]);
}
}
int main(int argc, char * argv[])
{
unordered_map<string,string> m = {
{"aaa", "111" },
{"bbb", "222" },
{"ccc", "333" },
{"ddd", "444" },
{"eee", "555" }
}, p;
{
ofstream out("data",ios::binary);
map2file(m,out);
}
{
ifstream in("data",ios::binary);
file2map(in,p);
for(auto& s: p) cout << s.first << " " << s.second << endl;
}
}