gpt4 book ai didi

c++ - 在内存映射文件中存储 vector

转载 作者:太空狗 更新时间:2023-10-29 21:41:11 25 4
gpt4 key购买 nike

我正在尝试将任意元素的 vector 存储在内存映射文件中(目前我正在尝试使用整数 vector 取得成功,但它应该适用于任意对象的 vector )。我找到了很多关于共享内存的文档,但没有找到内存映射文件的文档。由于我已经在内存映射文件中成功制作并使用了 R 树(如 that example 中),我尝试用 vector 复制该过程,但我想我遗漏了一些关键元素,因为它不起作用。这是我的代码:

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”作为参数传递给 vector 构造函数,它不期望它(除其他外,我得到错误 /usr/include/c++/4.8/bits/STL_vector.h:248:7: note: candidate expects 0 arguments, 1 provided)。但是,我不知道如何将分配器传递给 find_or_construc(),我认为这对于在内存映射文件中正确创建 vector 至关重要。删除最后一行末尾的 (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");

任何帮助将不胜感激。`

最佳答案

如示例所示,将您的自定义分配器告诉 vector 类,而不是

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为元素类型使用分配器(不是为 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());
}

关于c++ - 在内存映射文件中存储 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29602311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com