vector<int> master(100);
vector<reference_wrapper<int>> sub = master(&master[10], &master[20]);
boost::mpi::irecv(source, tag, sub);
上述内容对于接收和更新向量子集是否有效且有效?
如果没有,除了 recv 和 copy 之外,是否有等效的替代方案?
你的代码是无效的,因为你的编译器会很乐意告诉你。std::vector<std::reference_wrapper<int>>
没有这样的构造函数。reference_wrapper
也不会神奇地以这种方式工作。
有人可能会认为,在这种情况下使用boost::iterator_range
是个好主意,但它不支持序列化。因此,除了构建自己的支持序列化的范围适配器外,您还必须手动执行此操作。幸运的是,通过使用数组重载,这非常简单:
comm.irecv(source, tag, &master[10], 10);
这是有效的,因为std::vector
保证使用连续存储。请注意,您还必须以数组形式发送数据。不要只发送较小的 10 元素向量。