在具有类似 lambda 语法的结构列表中搜索 C++

Searching in a list of structs with lambda-like syntax in C++

本文关键字:列表 结构 搜索 C++ 语法 lambda      更新时间:2023-10-16
struct Data
{
int Id;
std::vector<int> SomeData
}
std::vector<Data> dataList = ....
int wantedIndex = 11;
std::find(dataList.begin(), dataList.end(), "where dataList.Id == wantedIndex")

在 Visual Studio 2008 中,这种语法在标准C++中是否可行?

如果您不能使用 C++11。也许你可以使用增强凤凰。

它会是这样的:

#include <boostphoenixphoenix.hpp>
...
std::find_if(dataList.begin(), dataList.end(), 
boost::phoenix::bind(&Data::Id, boost::phoenix::placeholders::arg1) == boost::phoenix::val(wantedIndex)));

虽然我认为在您非常简单的情况下,来自 boost 的绑定也可以做到这一点。

std::find_if(dataList.begin(), dataList.end(), boost::bind(&Data::Id, _1) == wantedIndex);

C++11 附带对 lambda 的支持:

std::find_if(dataList.begin(), dataList.end(), 
             [&wantedIndex](const Data& x) { return x.Id == wantedIndex;});
好吧,

如果你有Visual Studio 2008,那么你不能使用lambda函数,我想正确的做法如下:

int wanted_index = 11;
struct Data
{
int Id;
std::vector<int> SomeData
}
bool find_fun(int i)
{ 
 return i == wanted_index;
}
//std::vector<Data> dataList = ....
std::find(dataList.begin(), dataList.end(), find_fun);

您还可以使用 boost bind 或 std::tr1 bind 来拥有类似语法的 lambda 函数。从 msdn visual studio 2008 文档中可以看出,您也可以使用 std::bind((请参阅: http://msdn.microsoft.com/en-us/library/bb982702(v=vs.90(.aspx

所以你可以使用:

bool find_fun1(int i, int wanted_index)
{
  return i == wanted_index
}
int wanted_index = 11;
std::find_if(dataList.begin(), dataList.end(), std::bind(find_fun1,_1,wanted_index));