0
vector<int> master(100);
vector<reference_wrapper<int>> sub = master(&master[10], &master[20]);
boost::mpi::irecv(source, tag, sub);

上述是否有效且可用于接收和更新向量的子集?

如果没有,除了 recv 和 copy 之外,还有其他等效的选择吗?

4

1 回答 1

2

您的代码无效,因为您的编译器会很高兴地告诉您。a 没有这样的构造函数std::vector<std::reference_wrapper<int>>。也reference_wrapper不会以这种方式神奇地工作。

有人可能会认为,boost::iterator_range在这种情况下使用这将是一个好主意,但它不支持序列化。因此,除了构建自己的支持序列化的范围适配器之外,您还必须手动完成。幸运的是,通过使用数组重载,这非常简单:

comm.irecv(source, tag, &master[10], 10);

std::vector是有效的,因为保证使用连续存储。注意,您还必须以数组形式发送数据。不要只发送一个较小的 10 元素向量。

于 2016-04-11T19:51:14.453 回答