将现有的shared_ptr追加到shared_ptr的向量

时间:2019-09-05 13:33:46

标签: c++ c++11 vector shared-ptr

我有一个shared_ptr的向量。我想搜索该向量,如果满足条件,请将各自的shared_ptr复制到一个新的向量。

...
//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

2 个答案:

答案 0 :(得分:3)

  

我不相信以上说法是正确的?

根据您的需求规范,这是正确的。


如果您想了解更多...

尤其是以下声明:

output_vec.push_back( *iter );

具有以下效果:

  • *iter返回对智能指针的引用,即std::shared_ptr<Foo>&
  • output_vec.push_back将创建一个智能指针,并调用 copy-constructor
  • std::shared_ptr的副本构造函数:
      

    构造一个shared_ptr,它共享由r管理的对象的所有权。

因此将增加共享对象的引用计数器

附加说明...

仅出于完整性考虑,我会添加一些个人建议。

1) For-each 循环可以用更好的方式表示:

for (const auto& ptr : main_vec) {
  if (ptr->bar()) output_vec(ptr);
}

2)特别是,此for-each可以与copy_if进行合成。

答案 1 :(得分:2)

  

我猜测这将复制shared_ptr

正确。

  

但不增加原始文件的ref_count

否,复制构造函数确实会增加引用计数。这就是共享指针被设计为可复制的方式。

  

我不确信上面的说法是正确的吗?

那我就说服您:是正确的。