Appending an existing shared_ptr to a vector of shared_ptr
我有一个 shared_ptr 的现有向量。我想搜索该向量,如果满足条件,请将相应的 shared_ptr 复制到新向量。
1 2 3 4 5 6 7 8 9 10 11 12
| ...
//vector< shared_ptr<Foo> > main_vec; // which already has some data
vector< shared_ptr<Foo> > output_vec{};
for ( auto iter = main_vec.begin() ; iter != main_vec.end() ; ++iter )
{
if ( (*iter)->bar() == true )
output_vec.push_back( *iter );
}
return output_vec;
... |
我不相信以上是正确的?我猜这将复制 shared_ptr 但不会增加原始的 ref_count ,还是我在想这个?我对智能指针很陌生。
TIA
- 为什么你认为它不会增加引用计数?您正在创建一个新的参考。另见 std::copy_if
-
复制 shared_ptr 会增加 ref_count,这就是 shared_ptr 的工作方式。
-
为什么你认为 (*iter)->bar() == true 就足够了? == 在这种情况下也返回布尔值。也许( (*iter)->bar() == true ) == true?
-
@Slava 这是一个风格选择。 == true 本身并没有错。
-
bar() 只是类 foo 中的一些方法,例如如果在该特定对象中设置了标志。 copy_if 看起来很完美,带有 lambda,非常感谢大家的投入。我担心我会陷入复制 shared_ptr 的陷阱,其中两个彼此都不知道,导致双重删除(复制不是我要找的工作,但希望你明白我的意思!)
-
@Fran?oisAndrieux 当然。就像 == true ) == true 本质上没有任何问题一样:)
-
@GreenaGiant shared_ptr 旨在尽可能安全和简单。您似乎担心会有两组 shared_ptr 拥有同一个对象。这是一个有效的问题,但只有当您从原始指针初始化两个或多个 shared_ptr 时才会出现。 shared_ptr 之间的分配是安全的。
-
明白了,非常感谢!如果在这种情况下存在等效的"move_if",而不是"copy_if"进入新向量并保留原始向量,但相同但从原始向量中删除相应的元素?再次欢呼
-
@eerorika 这是真的。虽然 == true 可能没那么有用,但不难想象它是一种必需或期望的样式。它可以用来按照惯例提示 bar() 的返回类型,或者为了初学者的利益或任何其他原因。但是很难想象链接一系列 == true 将如何提供任何好处(但我想这并非不可能)。但是,该示例显然是为模拟 OP 而编写的。但是通过使它成为一种嘲弄,这也意味着他/她的立场必然是正确的。简单地说 == true 不是必需的就可以了。
-
旁白:std::copy_if(main_vec.begin(), main_vec.end(), std::back_inserter(output_vec), [](auto foo){ return foo->bar(); });
-
@molbdnilo 谢谢,但令人惊讶的是,我能够在没有您微妙且非常聪明的提示所提供的洞察力的情况下发现冗余。
-
@Fran?oisAndrieux 我不同意:我没有看到任何嘲笑 Slava 的评论。 == true 系列是一个很好的说明,它有望引发对为什么 == true 是多余的理解。简单地说明它的冗余并没有那么有价值。当然,评论可能很有趣(这也增加了评论的内在价值),但这并不意味着有人被嘲笑。
-
只是加入 ==true 的阴谋,在这种情况下,它是多余的。我的直线经理是否强制我使用它来实现"代码可读性"……是的。咩
I am not convinced the above is correct??
根据你的需求规范,没错。
如果您想了解更多...
特别是声明:
1
| output_vec.push_back( *iter ); |
有以下效果:
-
*iter 返回对智能指针的引用,即 std::shared_ptr<Foo>&。
-
output_vec.push_back 将创建一个新的智能指针,调用复制构造函数。
-
std::shared_ptr 的复制构造函数:
Constructs a shared_ptr which shares ownership of the object managed by r.
所以对共享对象的引用计数器会增加。
补充笔记...
为了完整起见,我会添加一些个人建议。
1) For-each 循环可以用更好的方式表示:
1 2 3
| for (const auto& ptr : main_vec) {
if (ptr->bar()) output_vec(ptr);
} |
2) 特别是,这个 for-each 可以用 copy_if.
合成
- 非常感谢。我同意远程 for 循环更好......老板没有;认为这是"千禧年代码"哈哈。
I am guessing that this will copy the shared_ptr
正确。
but not increase the ref_count of the original
不,复制构造函数确实增加了引用计数。这就是共享指针被设计成可复制的方式。
I am not convinced the above is correct?
那么让我说服你:这是正确的。