通过构件数据搜索结构项中的载体(Search for a struct item in a vect

2019-07-18 00:02发布

我很新的C ++,我试图找到一种方法来搜索结构的向量与为某个部件的数据结构。

我知道这将与简单类型的矢量工作

std::find(vector.begin(), vector.end(), item) != vector.end()

但可以说,我有这样的结构:

struct Friend
{
  string name;
  string number;
  string ID;
};

和这样的载体:

vector<Friend> friends;

然后载体充满了朋友。

比方说,我要寻找具有一定ID的朋友,和COUT的细节。 或删除Vector中的某些结构。 有没有一种简单的方法来做到这一点?

Answer 1:

这是可以做到std::find_if和搜索谓词,可如果你有可以表示为一个lambda函数的C ++ 11(或C ++ 0x中)可得:

auto pred = [](const Friend & item) {
    return item.ID == 42;
};
std::find_if(std::begin(friends), std::end(friends), pred) != std::end(friends);

使用给定的作为变量的ID,必须捕捉它在λ表达式(内[...]

auto pred = [id](const Friend & item) {
    return item.ID == id;
};
std::find_if(std::begin(friends), std::end(friends), pred) != std::end(friends);

如果你没有C ++ 11可这样做,你必须定义谓词函子(函数对象)。 雷米勒博的答案使用了这种方法。

要删除匹配如由谓词中定义的标准的元件,使用remove_if代替find_if (语法的其余部分是相同的)。

对于多个算法,见的STL <algorithm>参考 。



Answer 2:

使用std::find_if() @leemes和@AndyProwl展示了如何使用它在C ++编译器11。 但是,如果你不使用C ++编译器11,那么你可以使用它像这样代替,它定义了一个函子比较构造函数中先前指定的ID给定项目的ID:

class MatchesID
{
    std::string _ID;

public:
    MatchesID(const std::string &ID) : _ID(ID) {}

    bool operator()(const Friend &item) const
    {
        return item.ID == _ID;
    }
};

std::find_if(vector.begin(), vector.end(), MatchesID("TheIDHere")) != vector.end();

如果你在你的项目中的其他类,其使用的ID,就可以使这个仿函数模板:

template<typename IDType>
class MatchesID
{
    IDType _ID;

public:
    MatchesID(const IDType &ID) : _ID(ID) {}

    template<class ItemType>
    bool operator()(const ItemType &item) const
    {
        return item.ID == _ID;
    }
};

std::find_if(vector.begin(), vector.end(), MatchesID<std::string>("TheIDHere")) != vector.end();


Answer 3:

您可以使用std::find_if结合仿函数或lambda表达式(如果您正在使用C ++ 98的工作)(如果使用的是C ++ 11,我会假设):

using namespace std;
int ID = 3; // Let's say...
auto it = find_if(begin(vector), end(vector), [=] (Friend const& f) { 
    return (f.ID == ID); 
    });
bool found = (it != end(vector));


Answer 4:

如果你想找到在STL容器中的元素,使用的std ::发现或性病:: find_if算法用C ++ 03,你需要重载==操作符的标准::发现

bool operator==(const Friend& lhs, const Friend& rhs)
{
  return lhs.ID == rhs.ID;
}

if (std::find(friends.begin(), friends.end(), item) != friends.end())
{
   // find your friend
}

或C ++ 11拉姆达:

std::find_if(friends.begin(), friends.end(),  [](Friend& f){ return f.ID == "1"; } );

如果你想删除某个元素,使用的std ::的remove_if

std::remove_if(friends.begin(), friends.end(), 
      [](Friend& f){ return f.ID == "1"; });


文章来源: Search for a struct item in a vector by member data