Re[2]: STL. Можно ли сохранить map (hash_map) на диске.
От: Юнусов Булат Россия  
Дата: 22.01.02 15:08
Оценка:
Здравствуйте 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;
}


Удачи
Булат
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.