Я пытаюсь сохранить вектор произвольных элементов в файле с отображением памяти (на данный момент я пытаюсь добиться успеха с помощью вектора 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.`
Там всегда перегрузок с аллокатора, это просто что распределитель не соответствует типу аргумента шаблона 'Allocator' по умолчанию (' std :: allocator ') (см. http://en.cppreference.com/w/cpp/container/vector) –
sehe
Почему вы пытаетесь это сделать? Зачем (зачем) нужен вектор («контейнер высокого уровня») в файле с отображением памяти (вещь низкого уровня). Пожалуйста, отредактируйте свой вопрос, чтобы улучшить его. –