如何根据类成员之一在类对象向量中查找元素并将其删除

问题描述 投票:0回答:1

我有

vector
的课程。每个类都有两个成员变量,一个名称(字符串)和工作时间(整数)。 我的目标只是删除数组中包含特定名称的元素。

我知道我不能使用

find()
算法,所以我正在尝试使用
find_if()
算法。 我尝试过创建自己的布尔函数,但它不起作用。所以我尝试使用 lambda 函数,结果同样不好。

阅读

find_if
的文档。显然我需要给它一个可调用的对象,比如指针。但如果是这样,我将如何通过我的
Employee
类,来比较它的成员函数
name
以及我想要与之比较的单词?

这是我的代码:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <string_view>
#include <string>

//First problem is using class and std::vector
//Track employees and time worked
class Employee
{
public:
    std::string_view m_name{};
    int m_time{};

    Employee(std::string_view name, int time)
    :m_name{name}, m_time {time}
    {
    }
};

void printEmployees(const std::vector<Employee>& employee)
{
    for (const auto& a: employee)
    {
        std::cout << a.m_name << " " << a.m_time << "\n";
    }

}

bool findEmployee(Employee &employee, std::string_view myWord)
{
    if (myWord == employee.m_name)
        return true;

    else
        return false;
}



int main()
{
    std::vector<Employee> employee{   {"Daniel Ramirez", 14},
                                      {"Marta Martinez", 55},
                                      {"Joseph Martin", 100}
                                           };


    // erase the element that contains "Marta Martinez" on the array:
    std::string myWord{"Marta Martinez"};

    // auto it { std::find_if(employee.begin(),employee.end(), findEmployee(employee, myWord) ) };


    //using lambda
    auto it { std::find_if(employee.begin(),employee.end(),   [](const Employee& employee, std::string_view myWord)
                                                                                    {
                                                                                        if (myWord == employee.m_name)
                                                                                            return true;

                                                                                        else
                                                                                            return false;
                                                                                    }) };

    if (it == employee.end())           // check if element was found
        std::cout << "Element wasn't found";


    //printEmployees(employee);
    return 0;
}

错误:

error: no matching function for call to object of type '(lambda at /Users/danielramirez/CLionProjects/test/main.cpp:81:63)'
        if (__pred(*__first))

我知道我在实现

find_if
算法的第三个参数方面做错了。非常感谢任何帮助。

c++ algorithm lambda find
1个回答
2
投票

find_if
采用单参数 lambda。您不需要将
myWord
传递给它,只需捕获它(例如使用
[&]
-“默认情况下通过引用捕获所有内容”)。

[&](const Employee& employee)
{
    return myWord == employee.m_name;
}

您还可以将

if (x) return true; else return false;
简化为
return x;
,如图所示。


然后将生成的迭代器传递给

employee.erase(it);
(如果不是
.end()
)以删除该元素。

或者您可以使用

std::erase_if(employee, /*same lambda as a above*/);
oneliner 删除所有匹配项。

© www.soinside.com 2019 - 2024. All rights reserved.