Поиск в списке структур с лямбда-подобным синтаксисом в C ++ - PullRequest
0 голосов
/ 09 февраля 2012
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")

Возможен ли этот синтаксис в стандарте C ++ каким-либо образом в Visual Studio 2008?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Если вы не можете использовать C ++ 11.Может быть, вы можете использовать boost phoenix .

Это было бы так:

#include <boost\phoenix\phoenix.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);
1 голос
/ 09 февраля 2012

Что ж, если у вас есть Visual Studio 2008, то вы не можете использовать лямбда-функцию, я думаю, правильный способ сделать это:

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));
1 голос
/ 09 февраля 2012

C ++ 11 поставляется с поддержкой лямбд:

std::find_if(dataList.begin(), dataList.end(), 
             [&wantedIndex](const Data& x) { return x.Id == wantedIndex;});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...