从 std::list 中删除具有特定值的元素

2024-04-27

我需要从 std::list 中删除具有特定值的元素。随着list<int>我使用了remove()方法。

我现在有list<CMyClass>所以我想我应该使用remove_if(),但它的谓词只需要一个参数——要测试的元素。

我如何编写一个函数foo(const CMyClass &Bad)它从列表中删除所有等于 Bad 的元素?

Thanks

PS

struct CMyClass {
    void *Ptr;
    int Var;
}

bool is_equal(const CMyClass &A, const CMyClass &B)
{
    if (A.Ptr == B.Prt and A.Var == B.Var)
        return true;
    else
        return false;
}

您的类必须在 ClassName 中实现运算符 ==

bool operator == ( const Class& rhs );

然后你可以使用

list.remove( Bad )

如果您的班级拥有运算符 == (不仅仅是用于删除)是合理的 - 那么 list::remove 对您的解决方案很有好处。如果运算符 == 仅适用于 list::remove,那么最好使用 remove_if。

在以下示例中演示了 list::remove 和 list::remove_if。

struct Class
{
    int a_;
    int b_;

    Class( int a, int b ):
        a_( a ),
        b_( b )
    {}

    bool operator == (const Class &rhs)
    {
        return (rhs.a_ == a_ && rhs.b_ == b_);
    }

    void print()
    {
        std::cout << a_ << " " << b_ << std::endl;
    }
};

bool isEqual( Class lhs, Class rhs )
{
    return (rhs.a_ == lhs.a_ && rhs.b_ == lhs.b_);
}

struct IsEqual
{
    IsEqual( const Class& value ):
        value_( value )
    {}

    bool operator() (const Class &rhs)
    {
        return (rhs.a_ == value_.a_ && rhs.b_ == value_.b_);
    }

    Class value_;
};

int main()
{
    std::list<Class> l;

    l.push_back( Class( 1, 3 ) );
    l.push_back( Class( 2, 5 ) );
    l.push_back( Class( 3, 5 ) );
    l.push_back( Class( 3, 8 ) );

    Class bad( 2, 5 );

    std::cout << "operator == " << std::endl;
    l.remove( bad );
    std::for_each( l.begin(), l.end(), std::mem_fun_ref( &Class::print ) );

    std::cout << "binary function predicat" << std::endl;
    l.push_back( Class( 2, 5 ) );
    l.remove_if( std::bind2nd( std::ptr_fun(isEqual), bad ) );
    std::for_each( l.begin(), l.end(), std::mem_fun_ref( &Class::print ) );


    std::cout << "functor predicat" << std::endl;
    l.push_back( Class( 2, 5 ) );
    l.remove_if( IsEqual( bad ) );
    std::for_each( l.begin(), l.end(), std::mem_fun_ref( &Class::print ) );

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 std::list 中删除具有特定值的元素 的相关文章

随机推荐

  • NAudio 音调变换

    我正在使用 NAudio DLL 并且正在寻找音调变换声音的示例代码 有一个使用的例子NAudio https github com naudio NAudio用于开源中的音高变换Skype 变声器 https github com mar
  • 如何远程获取系统的网络共享和连接?

    我正在寻找一种远程获取类似于以下控制台应用程序的信息的方法 net use 净份额 网络统计 ano 但是 我需要能够在系统上运行第三方应用程序的情况下执行此操作 这有效地排除了使用 psexec 远程执行命令 因为 psexec 将作为服
  • .NET:十进制到舍入字符串

    如果我有一个decimal 如何获得带有两位小数的字符串版本 这不起作用 Math Round myDecimal 2 ToString 0 00 不要使用大括号 它们用于使用以下命令将格式化值嵌入到较长的字符串中string Format
  • Swift NSSet 和 CoreData

    我正在尝试将目标 C 和 CoreData 应用程序移动到 Swift 和 iOS 但在迭代 NSSet 对象时遇到了困难 Xcode 已生成这些类 class Response NSManagedObject NSManaged var
  • ruby 2.0.0 捆绑包在 Gemfile 上失败并显示“key: value”

    我正在尝试使用 Gemfile 更新我的 gem 但总是在同一行失败 Gemfile group doc do gem sdoc require false end Command bundle update 我总是收到这个错误 Gemfi
  • 对齐顶部两个具有不同字体大小的文本视图

    我使用约束布局 我想实现以下目标 app layout constraintBaseline toBaselineOf 属性底部对齐两个文本视图 有什么方法可以使两个顶部对齐吗 由于大小差异 常规的 app layout constrain
  • 为什么枚举可以有包私有构造函数?

    既然枚举构造函数只能由其常量调用 为什么允许它是包私有的呢 构造函数实际上不是包私有的 它是隐式的private接口方法的隐式方式public即使您不添加关键字 JLS 的相关部分 8 8 3 http docs oracle com ja
  • Git“预接收”挂钩和“git-clang-format”脚本可以可靠地拒绝违反代码风格约定的推送

    让我们立即从一个片段开始pre receive我已经写过的钩子 bin sh format bold 033 1m format red 033 31m format yellow 033 33m format normal 033 0m
  • INotifyPropertyChanged 与线程

    我有一个 BindingList
  • 如何在 OpenAPI (Swagger) 中参数化 API 基本路径?

    我有一个像这样的网址 id idnumber status 在这个网址中 id idnumber 是 API 基本路径 并且 status是资源 我知道 OpenAPI Swagger 允许在路径中使用参数 如下所示 paths id nu
  • 在 R 4.0.2 中安装 rsvg 库 (conda-forge)

    我在下载 r 包时遇到困难rsvg 我首先使用 conda 为最新的 R 版本 4 0 2 创建了一个环境 如下所示指示 https anaconda org conda forge r base 我能够毫无问题地下载许多其他 R 包和生物
  • Highcharts 在导出时添加图像

    我使用具有导出功能的 Highcharts 根据我的理解 将图像添加到图表中 我可以使用渲染器 该渲染器工作正常 但我不希望图像 徽标 出现在应用程序中的图表上 我希望它出现仅在出口时 我该如何做到这一点 你应该使用图表选项 http ap
  • 循环遍历每一列和行,做一些事情

    我认为这是描述我想做的事情的最佳方式 df column lt ifelse is na df column TRUE 0 1 但其中的列是动态的 这是因为我有大约 45 列 全部具有相同类型的内容 而我想做的就是检查每个单元格 如果其中有
  • 使用 istream_iterator 范围构造时无法访问向量

    我尝试编译此代码片段 但出现编译器错误 使用 Visual Studio 2010 进行编译 include
  • 推导具有两个以上参数的 std::function

    我想知道为什么std function http en cppreference com w cpp utility functional function只知道有两个参数的函数 我已经编写了一些运行良好的代码 但存在许多限制 欢迎任何反馈
  • 即使在回发后也保持用户检查 radiobtn 检查

    我有以下无线电控件 默认选中 全部 如果用户检查其他一些单选按钮并提交 在回发时我想保留选中的按钮 以便用户可以看到他们单击的内容 如何保留使用 jquery 选择的内容 我正在使用的是
  • C#中判断HDD是GPT还是MBT

    如何用 C 判断硬盘类型是 GPT 还是 MBR 我查看了Win32 DiskDrive 似乎没有它 您想要使用 PInvoke 请参阅http pinvoke net http pinvoke net with CreateFile De
  • 提升精神带走关键字并忽略船长

    这是使用表达式的语法的一小部分 prefix lit L not gt gt prefix lit gt gt prefix postfix 我在 postfix 内部有某种方式纯名称获取标识符 name pure lexeme boost
  • C++ 抛硬币程序错误

    我正在尝试计算抛硬币中连续的正面朝上的次数 不幸的是 我的连续头计数器没有正确增加 有任何想法吗 代码和示例输出如下 include
  • 从 std::list 中删除具有特定值的元素

    我需要从 std list 中删除具有特定值的元素 随着list