Здравствуйте grs, Вы писали:
grs>Здравствуйте Serg777, Вы писали:
S>>Сравнительно недавно работаю с STL. Есть ли возможность сохранить весь map (hash_map) на диске? Хотелось бы быстро прочитать объект с диска, а не строить его каждый раз заново. Проблем нет, когда записей мало, но у меня их может быть несколько десятков тысяч. И так как это практически неизменяемая информация, хотелось бы один раз построить объект, сохранить, и затем быстренько читать то, что сохранено. В MFC такая возможность у объекта CMap есть.
grs>Стандартной функции типа CObject::Serialize() нет. Но что мешает сделать все руками, там, на вскидку, цена вопроса — копейки?
Я к тому что если типпы в мапе стандартные то все в самом деле просто.
#pragma warning(disable: 4786)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
template<class Key, class Value>
std::fstream& operator<<( std::fstream& fs, std::map<Key,Value> const &ob) throw ()
{
fs << (int)ob.size() << std::endl;
for(std::map<Key,Value>::const_iterator it = ob.begin(); it != ob.end(); ++it)
{
fs << it->first << std::endl;
fs << it->second << std::endl;
}
return fs;
}
template<class Key, class Value>
std::fstream& operator>>( std::fstream& fs, std::map<Key,Value> &ob) throw ()
{
ob.clear();
int size;
fs >> size;
for(int i=0; i < size; ++i)
{
Key key;
fs >> key;
fs >> ob[key];
}
return fs;
}
int main(int argc, char* argv[])
{
std::map< std::string, int > m;
m["Hello"] = 1;
m["World"] = 2;
std::fstream fs;
fs.open("data.txt", std::ios::out);
fs << m;
fs.close();
fs.open("data.txt", std::ios::in);
for(std::map< std::string, int>::iterator it = m.begin(); it != m.end(); ++it)
std::cout << (*it).first << " " << (*it).second << std::endl;
return 0;
}
Удачи
Булат