#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <iostream>
using namespace boost::interprocess;
using std::cout;
using std::endl;
//類型和allocator的定義,使用共享內存時需要使用boost::interprocess中
//重新實現的容器而不能使用標準容器
typedef managed_shared_memory::segment_manager segment_manager_t;
typedef allocator<void, segment_manager_t> void_allocator;
/*-- 自定義string數據類型 --*/
typedef allocator<char, segment_manager_t> char_allocator;
typedef basic_string<char, std::char_traits<char>, char_allocator> char_string;
/*-- 自定義map<string, string>數據類型 --*/
typedef std::pair<const char_string, char_string> string_string_value_type;
typedef allocator<string_string_value_type, segment_manager_t> string_string_map_allocator;
typedef map<char_string, char_string, std::less<char_string>, string_string_map_allocator> string_string_map;
/*-- 自定義map<string, map<string, string>> --*/
typedef std::pair<const char_string, string_string_map> string_string_string_value_type;
typedef allocator<string_string_string_value_type, segment_manager_t> string_string_string_map_allocator;
typedef map<char_string, string_string_map, std::less<char_string>, string_string_string_map_allocator> string_string_string_map;
int main()
{
/* ---創建共享內存,並創建map--- */
//移除共享內存
shared_memory_object::remove("MySharedMemory");
//創建共享內存,並指定名稱和大小
managed_shared_memory segment(open_or_create, "MySharedMemory", 102400);
void_allocator alloc_inst(segment.get_segment_manager());
//在共享內存上構建string_string_string_map,並返回指針
string_string_string_map *table_map = segment.construct<string_string_string_map>("table_map")(std::less<char_string>(), alloc_inst);
//構建自定義string
char_string key_key_string("tag", alloc_inst);
char_string key_string("fvalue", alloc_inst);
char_string value_string("tag_fvalue", alloc_inst);
//構建自定義map<string, string>的鍵值對,不能夠使用std::string
string_string_value_type ss_map_value(key_string, value_string);
//在共享內存上構建string_string_map並返回指針
string_string_map *col_map = segment.construct<string_string_map>
("tag_fvalue")(std::less<char_string>(), alloc_inst);
col_map->insert(ss_map_value);
//構建自定義map<string, map<string, string>>的鍵值對
string_string_string_value_type sss_map_value(key_key_string, *col_map);
table_map->insert(sss_map_value);
/* ---讀取共享內存,並解析map--- */
managed_shared_memory segment1(open_or_create, "MySharedMemory", 102400);
string_string_string_map *table_map2 = segment1.find<string_string_string_map>("table_map").first;
//創建對應迭代器
string_string_string_map::iterator sss_ite;
string_string_map::iterator ss_ite;
char_string key_name1("tag", alloc_inst);
char_string key_name2("fvalue", alloc_inst);
//從map中遍歷數據,與stl的map一致
sss_ite = table_map2->find(key_name1);
if (sss_ite != table_map2->end())
{
cout << sss_ite->first << endl;
ss_ite = sss_ite->second.find(key_name2);
cout << ss_ite->second << endl;
}
return 0;
}
看了關於boost實現共享內存和boost在共享內存中創建vector的帖子,但是沒有發現有嵌套map的資料,就把以前寫的例子貼出來了。
c++中用boost實現共享內存創建map容器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.