2015-04-13 5 views
1

Я пытаюсь сохранить вектор произвольных элементов в файле с отображением памяти (на данный момент я пытаюсь добиться успеха с помощью вектора int, но он должен работать с вектором произвольных объектов). Я нашел много документации по этому поводу с разделяемой памятью, но не с соответствующими картами памяти. Поскольку я успешно создал и использовал R-деревья в файле с отображением памяти (например, в that example), я попытался реплицировать процесс с помощью векторов, но я думаю, что у меня отсутствует какой-то важный элемент, потому что он не работает. Вот мой код:Хранение вектора в файле с отображением памяти

namespace bi = boost::interprocess; 
typedef bi::allocator<std::vector<int>, bi::managed_mapped_file::segment_manager> allocator_vec; 
std::string vecFile = "/path/to/my/file/vector.dat"; 
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000); 
allocator_vec alloc_vec(file_vec.get_segment_manager()); 
std::vector<int> * vecptr = file_vec.find_or_construct<std::vector<int> >("myvector")(alloc_vec); 

Вероятно, моя последняя строка не так, потому что «alloc_vec» передается в качестве аргумента вектора конструктора, который не ожидает, что (я среди других ошибок /usr/include/c++/4.8/bits/stl_vector.h:248:7: note: candidate expects 0 arguments, 1 provided). Однако я не знаю, как передать распределитель find_or_construc(), который, как я полагаю, имеет решающее значение для правильного создания вектора в файле с отображением памяти. Удаление (alloc_vec) в конце последней строки приводит к другой ошибке, что у меня больше проблем решить:

error: cannot convert ‘boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>::construct_proxy<std::vector<int> >::type {aka boost::interprocess::ipcdetail::named_proxy<boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>, std::vector<int>, false>}’ to ‘std::vector<int>*’ in initialization 
std::vector<int> * vecptr = file_vec.find_or_construct<std::vector<int> >("myvector"); 

Любая помощь будет значительно appreciated.`

+1

Там всегда перегрузок с аллокатора, это просто что распределитель не соответствует типу аргумента шаблона 'Allocator' по умолчанию (' std :: allocator ') (см. http://en.cppreference.com/w/cpp/container/vector) – sehe

+0

Почему вы пытаетесь это сделать? Зачем (зачем) нужен вектор («контейнер высокого уровня») в файле с отображением памяти (вещь низкого уровня). Пожалуйста, отредактируйте свой вопрос, чтобы улучшить его. –

ответ

1

Как образцы показывают, скажите векторный класс о ваш заказ распределитель, так что вместо

typedef std::vector<int> MyVec; 
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(alloc_vec); 

Использование

typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc; 
typedef std::vector<int, int_alloc> MyVec; 

int_alloc alloc(file_vec.get_segment_manager()); 
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(alloc); 

Отметьте, что

  • vector использует распределитель для типов элементов (не для вектора; segment_manager выделяет то)
  • , так как конструктор allocator<> неявно, вы можете просто передать segment_manager:

Live On Coliru

#include <boost/interprocess/managed_mapped_file.hpp> 

namespace bi = boost::interprocess; 

int main() { 
    std::string vecFile = "vector.dat"; 
    bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000); 

    typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc; 
    typedef std::vector<int, int_alloc> MyVec; 

    MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(file_vec.get_segment_manager()); 

    vecptr->push_back(rand()); 
} 
Смежные вопросы