【问题标题】:How to (re)move from a container if predicate is satisfied?如何(如果满足谓词,则从容器中删除?
【发布时间】:2017-04-02 11:08:06
【问题描述】:

如何使用 STL 算法模块将元素移动到aux_list

std::remove_copy_if( list.begin( ), list.end( ), std::back_inserter( aux_list ),
                     []( const value_type& item_ptr )
                     {
                         return !item_ptr->is_valid( );
                     } );

【问题讨论】:

  • 所以不是从list复制到aux_list,而是要移动元素?
  • 请注意,与顾名思义相反,remove_copy_if 实际上并没有删除任何内容。
  • 其实我之前也问过类似的问题。 stackoverflow.com/questions/27320577/…
  • 您的容器是实际的std::list 吗?在这种情况下,您应该使用splice 成员函数。

标签: c++ stl containers move-semantics stl-algorithm


【解决方案1】:

使用move iterators:

std::remove_copy_if(
    std::make_move_iterator(list.begin()),
    std::make_move_iterator(list.end()),
    std::back_inserter(aux_list),
    [](const value_type& item_ptr) { return !item_ptr->valid(); });

请注意,这些元素仍然存在于list 中——它们实际上并没有被删除(这是一个奇怪的命名算法——将其视为copy_unless())。因此,现在您将拥有一堆处于未指定状态的元素。

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 2020-09-11
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多