Boost logo

Boost :

Subject: Re: [boost] [interprocess] map of vectors
From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2008-11-25 15:04:54


Jan Stetka wrote:
> Hi,
>
> Is something like this likely to work?
>
> typedef interprocess::vector<int, ShmemAllocator> MyVector
>
> typedef std::pair<const long, MyVector> ValueType;
>
> typedef allocator<ValueType, managed_shared_memory::segment_manager>
> ShmemAllocator;
>
> typedef interprocess::map<long, MyVector, std::less<long>,
> ShmemAllocator> MyMap;

Yes, it should:

#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>

using namespace boost::interprocess;

typedef managed_shared_memory::segment_manager Mngr;

typedef allocator<int, Mngr> ShmemIntAllocator;
typedef vector<int, ShmemIntAllocator> MyVector;
typedef std::pair<const long, MyVector>ValueType;
typedef allocator<ValueType, Mngr> ShmemValueTypeAllocator;
typedef map<long, MyVector
    , std::less<long>, ShmemValueTypeAllocator> MyMap;

int main()
{
    {
    shared_memory_object::remove("name");
    managed_shared_memory shmem(open_or_create, "name", 65536);

    MyMap *m = shmem.construct<MyMap>("Map name")
       (std::less<long>(), shmem.get_segment_manager());

    //This is the usual way
    ValueType v(0, MyVector(shmem.get_segment_manager()));
    m->insert(v);
    //This is more efficient(data is moved instead of copied)
    //Note that "long" is not "const long"
    std::pair<long, MyVector> mv
       (1, MyVector(shmem.get_segment_manager()));
    m->insert(move(mv));

    //Even more efficient, in-place construction:
    //the first argument is for the key (long),
    //the rest are for the mapped type
    m->emplace(2, shmem.get_segment_manager());
    }
    shared_memory_object::remove("name");
    return 0;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk