在C++中执行C#LINQ Where/Select的正确方法是什么

What is the proper way to do a C# LINQ Where/Select in C++?

本文关键字:方法 是什么 Select C++ 执行 C#LINQ Where      更新时间:2023-10-16

在C#中,如果我有一个对象列表(例如List-myObjectList),我可以通过获得该列表的子集

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

假设我不想使用第三方C++LINQ库(只有标准库,可能还有boost),那么在C++中最好的方法是什么?为我想执行此操作的每个实例编写一个函数是很容易的,但最好知道存在什么框架来执行这种类型的操作。

如果C++98、C++0x或C++11中的答案不同,那么最好知道它们之间的差异。

在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));

您可以使用"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 ();

您可以使用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());