我很新的C ++,我试图找到一种方法来搜索结构的向量与为某个部件的数据结构。
我知道这将与简单类型的矢量工作
std::find(vector.begin(), vector.end(), item) != vector.end()
但可以说,我有这样的结构:
struct Friend
{
string name;
string number;
string ID;
};
和这样的载体:
vector<Friend> friends;
然后载体充满了朋友。
比方说,我要寻找具有一定ID的朋友,和COUT的细节。 或删除Vector中的某些结构。 有没有一种简单的方法来做到这一点?
这是可以做到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>
参考 。
使用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();
您可以使用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));
如果你想找到在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"; });