13

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

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

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

如果 C++98、C++0x 或 C++11 中的答案不同,最好了解它们的区别。

4

3 回答 3

5

在 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));
于 2013-09-27T23:25:40.190 回答
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 ();
于 2013-09-06T07:13:08.903 回答
3

您可以使用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());
于 2013-09-06T10:50:52.543 回答