Как правильно сделать C # LINQ Где / Выберите в C ++?

В C #, если у меня есть список объектов (например, List myObjectList), я могу получить подмножество этого списка через:

anotherMyObjectList = myObjectList.Where(x => x.isSomething()).Select(x => x).ToList();

Предполагая, что я не хочу использовать стороннюю библиотеку C ++ LINQ (только стандартную библиотеку и, возможно, повышение), каков наилучший способ сделать это в C ++? Было бы легко написать функцию для каждого экземпляра, в котором я хочу это сделать, но было бы лучше узнать, какая структура существует для выполнения операций такого типа.

Если ответ отличается в C ++ 98, C ++ 0x или C ++ 11, было бы хорошо узнать различия.

7

Решение

В C ++ 11, используя boost, вы можете сделать что-то вроде этого:

// assumming myObjectList is a vector of someObj type
std::vector<someObj> myObjectList = { ... };
auto result = myObjectList | boost::adaptors::filtered([](const someObj& x) { return x.isSomething(); });
std::vector<someObj> anotherMyObjectList(boost::begin(result), boost::end(result));
3

Другие решения

Вы можете использовать «ccplinq»:

using namespace cpplinq;
int ints[] = {3,1,4,1,5,9,2,6,5,4};
auto result = from_array (ints)
>> where ([](int i) {return i/2 == 0;})
>> select ([](int i) {std::stringstream s; s << i; return s.str();})
>> to_list ();
1

Ты можешь использовать std::copy_if() создать подмножество контейнера:

#include <algorithm>
#include <iterator>
#include <list>

std::list<object> myObjectList, anotherMyObjectList;

// fill myObjectList somehow

std::copy_if(cbegin(myObjectList),
cend(myObjectList),
std::back_inserter(anotherMyObjectList),
[](const object& o) { return o.IsSomething(); });

или если вы используете C ++ 98/03:

#include <algorithm>
#include <iterator>
#include <list>

std::list<object> myObjectList, anotherMyObjectList;

// fill myObjectList somehow

struct is_something {
bool operator()(const object&) {
return object.IsSomething();
}
};

std::copy_if(myObjectList.cbegin()
myObjectList.cend(),
std::back_inserter(anotherMyObjectList),
is_something());
1
По вопросам рекламы [email protected]