草庐IT

关于 c :将现有的 shared_ptr 附加到 shared_ptr 的向量中

codeneng 2023-03-28 原文

Appending an existing shared_ptr to a vector of 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

  • 为什么你认为它不会增加引用计数?您正在创建一个新的参考。另见 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??

根据你的需求规范,没错。

如果您想了解更多...

特别是声明:

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 循环可以用更好的方式表示:

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?

那么让我说服你:这是正确的。

有关关于 c :将现有的 shared_ptr 附加到 shared_ptr 的向量中的更多相关文章

  1. ruby-on-rails - rails : keeping DRY with ActiveRecord models that share similar complex attributes - 2

    这似乎应该有一个直截了当的答案,但在Google上花了很多时间,所以我找不到它。这可能是缺少正确关键字的情况。在我的RoR应用程序中,我有几个模型共享一种特定类型的字符串属性,该属性具有特殊验证和其他功能。我能想到的最接近的类似示例是表示URL的字符串。这会导致模型中出现大量重复(甚至单元测试中会出现更多重复),但我不确定如何让它更DRY。我能想到几个可能的方向...按照“validates_url_format_of”插件,但这只会让验证干给这个特殊的字符串它自己的模型,但这看起来很像重溶液为这个特殊的字符串创建一个ruby​​类,但是我如何得到ActiveRecord关联这个类模型

  2. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  3. ruby-on-rails - 如何重构 "shared"方法? - 2

    我正在使用RubyonRails3.2.2,我想从我的模型/类中“提取”一些方法。也就是说,在不止一个类/模型中,我有一些方法(注意:方法与用户授权相关,并被命名为“CRUD方式”),这些方法实际上是相同的;所以我认为DRY方法是将这些方法放在“共享”模块或类似的东西中。实现该目标的常见且正确的方法是什么?例如,我应该将“共享”代码放在哪里(在哪些目录和文件中)?如何在我的类/模型中包含提到的方法?你有什么建议?注意:我正在寻找“RubyonRails制作东西的方式”。 最佳答案 一种流行的方法是使用ActiveSupport关注点

  4. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  5. ruby-on-rails - 在现有数据库上进行 Rails 迁移 - 2

    我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这

  6. ruby - 如何将新的 rvm 安装与现有的 ruby​​ 版本相关联? - 2

    我遇到了RVM的问题,所以我卸载并重新安装了它。事实是我实际上尝试过rbenv,但这对我来说没有用,所以我试图让rvm重新启动并运行-而不必安装重复版本的Ruby。我至少安装了1个现有版本的Ruby:ruby--versionruby1.8.7(2011-12-28patchlevel357)[universal-darwin11.0]但是当我执行rvmlist时,我得到一个空白列表:bash-3.2$rvmlistrvmrubies#Defaultrubynotset.Try'rvmaliascreatedefault'.#=>-current#=*-current&&default

  7. ruby-on-rails - ActiveRecord 如何将现有记录添加到 has_many :through relationship in rails? 中的关联 - 2

    在我的Rails项目中,我有三个模型:classRecipe:recipe_categorizationsaccepts_nested_attributes_for:recipe_categories,allow_destroy::trueendclassCategory:recipe_categorizationsendclassRecipeCategorization通过这个简单的has_many:through设置,我怎样才能像这样获取给定的食谱:@recipe=Recipe.first并根据现有类别向此食谱添加类别,并在相应类别上对其进行更新。所以:@category=#Exi

  8. ruby - 如何断开现有的 ruby​​ 续集与数据库的连接? - 2

    我的意思是之前建立的那个DB=Sequel.sqlite('my_blog.db')或DB=Sequel.connect('postgres://user:password@localhost/my_db')或DB=Sequel.postgres('my_db',:user=>'user',:password=>'password',:host=>'localhost')等等。Sequel::Database类没有名为“disconnect”的公共(public)实例方法,尽管它有一个“connect”。也许有人已经遇到过这个问题。我将不胜感激。 最佳答案

  9. ruby-on-rails - Ruby on Rails - has_one 关系,如何检查它是否具有现有关联? - 2

    我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])

  10. Ruby 将对象插入现有的已排序对象数组 - 2

    我有以下现有的Dog对象数组,它们按age属性排序:classDogattr_accessor:agedefinitialize(age)@age=ageendenddogs=[Dog.new(1),Dog.new(4),Dog.new(10)]我现在想插入一条新的狗记录,并将它放在数组中的正确位置。假设我想插入这个对象:another_dog=Dog.new(8)我想把它插入到数组中,让它成为数组中的第三项。这是一个人为的示例,旨在演示我特别想如何将一个项目插入到现有的有序数组中。我意识到我可以创建一个全新的数组并重新对所有对象进行排序,但这不是我的目标。谢谢!

随机推荐