我对 C++11 的智能指针很陌生,我正在尝试在项目中有效地使用它们。在我的项目中,我有很多函数接受对 a vector
of的 const 引用unique_ptr
,对其进行一些计算,并将一些结果放在返回参数中,如下所示:
void computeCoefficients(const vector<unique_ptr<Scalar>>& roots,
vector<unique_ptr<Scalar>>& coeffs) {
...
}
我正在使用unique_ptr
,因为调用所有这些函数的过程是 中对象的唯一所有者vector
,并且这些函数只是“借用”对象以便将它们作为输入读取。
现在我正在尝试编写一个vector
对它接收的不同子集进行计算的函数,为了做到这一点,它需要具有vector
包含这些子集的不同“版本”,以便传递给另一个需要vector<unique_ptr<Scalar>>
作为输入。但是获得向量子集的唯一方法是复制它——这是一个问题,因为unique_ptr
s 不能被复制。我希望代码看起来像这样:
void computeOnSet(const vector<unique_ptr<Scalar>>& set, unique_ptr<Scalar>& output) {
...
}
void computeOnAllSubsets(const vector<unique_ptr<Scalar>>& set, vector<unique_ptr<Scalar>>& outputs) {
for(int i = 0; i < input.size(); i++) {
auto subset = vector<unique_ptr<Scalar>>(set.begin(), set.begin()+i);
subset.insert(subset.end(), set.begin()+i+1, set.end();
computeOnSubset(subset, outputs.at(i));
}
}
当然,这是行不通的。unique_ptr
如果我用s替换 s,我可以让它工作shared_ptr
,但这有两个问题:
- 从哲学上讲,这意味着我与
computeOnSubsets
函数共享集合的所有权,而我不是;调用者仍然是唯一的所有者。(我读到这shared_ptr
意味着您与所有拥有它的副本的东西共享所有权)。 - 即使在我不需要它的地方,它也会引入引用计数的开销,因为它会迫使我将所有方法的输入参数更改为
vector<shared_ptr<Scalar>>
.
我要做的就是制作一个临时的、只读的指针副本,其唯一目的是制作临时的、只读的子向量。有没有办法做到这一点?weak_ptr
听起来像我需要的(非拥有临时指针),但它只能与shared_ptr
.