将矩阵“shared_ptr<vector<vector<T>> sp”的一行“(*sp)[i]”传递给接受“shared_ptr<vector<T>>”的函数
Passing a row `(*sp)[i]` of a matrix `shared_ptr<vector<vector<T>> sp` to a function which accepts a `shared_ptr<vector<T>>`
我有一个 std::shared_ptr<std::vector<std::vector<double>> sp
并且需要将 (*sp)[i]
对于某些 i
传递给接受 std::shared_ptr<std::vector<double>>
的函数 foo
。我该怎么做?
一个选项是 foo(std::make_shared<std::vector<double>>((*sp)[i])
,但这会创建向量的副本 (*sp)[i]
。由于 (*sp)[i]
可能很大,我绝对不希望这种情况发生。
那么,是否有任何选项可以在不复制的情况下将 (*sp)[i]
传递给 foo
?
编辑:也许我们可以做以下事情:
foo(std::shared_ptr<std::vector<double>>(&(*sp)[i], [](std::vector<double>* p) { }));
使用别名构造函数。
foo(std::shared_ptr<std::vector<double>>(sp, &(*sp)[i]));
听起来你最好的选择是
A) 更改 foo 以接受对 shared_ptr 的引用,这将消除按值传递。
或
B) 使用 std::move 将你的 shared_ptr 移动到 foo 中,然后确保你在调用后不引用 sp。
正如 Quentin 所说,否则您当前的设置是不可能的。
我有一个 std::shared_ptr<std::vector<std::vector<double>> sp
并且需要将 (*sp)[i]
对于某些 i
传递给接受 std::shared_ptr<std::vector<double>>
的函数 foo
。我该怎么做?
一个选项是 foo(std::make_shared<std::vector<double>>((*sp)[i])
,但这会创建向量的副本 (*sp)[i]
。由于 (*sp)[i]
可能很大,我绝对不希望这种情况发生。
那么,是否有任何选项可以在不复制的情况下将 (*sp)[i]
传递给 foo
?
编辑:也许我们可以做以下事情:
foo(std::shared_ptr<std::vector<double>>(&(*sp)[i], [](std::vector<double>* p) { }));
使用别名构造函数。
foo(std::shared_ptr<std::vector<double>>(sp, &(*sp)[i]));
听起来你最好的选择是
A) 更改 foo 以接受对 shared_ptr 的引用,这将消除按值传递。
或
B) 使用 std::move 将你的 shared_ptr 移动到 foo 中,然后确保你在调用后不引用 sp。
正如 Quentin 所说,否则您当前的设置是不可能的。