2011-12-28 9 views
0

Я хочу, чтобы вставить общий вектор в общей карту, используя следующий код:Boost, создавая несколько векторных указателей

managed_shared_memory segment(create_only ,"MySharedMemory" ,65536); 

typedef allocator<int, managed_shared_memory::segment_manager> vecAllocator; 
typedef vector<int, vecAllocator> vec; 
typedef std::pair<int, vec* > ValueType; 
typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator; 
typedef multimap<int, vec*, std::less<int>, ShmemAllocator> MyMap; 

ShmemAllocator alloc_inst (segment.get_segment_manager()); 
vecAllocator vectorallocator (segment.get_segment_manager()); 


MyMap *mymap = segment.construct<MyMap>("MyMap")(std::less<int>(),alloc_inst); 
vec *myvec = segment.construct<vec>("myvec")(vectorallocator); 
vec *myvec1 = segment.construct<vec>("myvec1")(vectorallocator); 

myvec->push_back(10); 
myvec->push_back(9); 
myvec->push_back(8); 
myvec1->push_back(987); 
myvec1->push_back(123); 
myvec1->push_back(456); 


for(int i = 0; i < 6; ++i){ 
    for(int j = 0; j<6; j++) 
     mymap->insert(std::pair<int, vec*>(i, myvec)); 
} 
for(int i = 0; i < 6; ++i){ 
    for(int j = 0; j<6; j++) 
     mymap->insert(std::pair<int, vec*>(i, myvec1)); 
} 

код работает .. но то, что я хочу сделать, это построить вектор без имя. то есть сделать что-то вроде этого

vec *myvec = segment.construct<vec>(vectorallocator); 
vec *myvec1 = segment.construct<vec>(vectorallocator); 

так, что если я положил его в петлю, и нет никаких проблем с называя их по-разному каждый цикл. Есть ли способ сделать это? Или, по крайней мере, есть автоматический способ назвать их по-разному в каждом цикле?

ответ

0

Ну, мой предыдущий ответ был STUPID .. так вот правильный ответ Мы должны использовать анонимный экземпляр, чтобы получить то, что я хочу. Это делается с помощью

vec *myvec = segment.construct<vec>(anonymous_instance)(vectorallocator); 

это объясняется здесь http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_memory_segment_features.anonymous

Это также объясняет некоторые другие хорошие характеристики.

0

так как мне не нужно имя вектора, вот что я сделал.

unsigned int seconds; 
srand (time(NULL)); 
seconds = rand() % 1000000; 
std::stringstream buf; 
buf << seconds; 
vec *myvec = segment.construct<vec>((buf.str()).c_str())(vectorallocator); 

и я теперь есть много VEC * без необходимости рассмотреть на имя .. :)

это просто тривиальный ответ.

Смежные вопросы