3

我在我的代码中迭代了很多这样的项目:

for (; i != end; ++i) {
   if(!restricted(*i))
   {
     doSomethingWithI(*i)
   }
}

有没有更好的方法来做到这一点,也许使用 std 或 boost?

另一个例子:

for (; i != end; ++i) {
   if(!restricted(*i))
   {
     Path p = _pathFactory->build(*i);
     Value v = _db->load(p);
     std::string output = _styler->style(v); 
     _output->write(output);
   }
}
4

2 回答 2

2

您可以编写一个仿函数并使用 for_each。

class Functor {
    ...
    void operator()(Item& i)
    {
       if(...)
       {
            ...
       }
    }
};

在您的代码中,在多个地方:

std::for_each(vec.begin(), vec.end(), Functor());

operator()() 在每个元素上都被调用。

Functor 非常灵活,可以将其模板化,也可以在构造函数中传递参数给它。

您还可以在标头中使用一些默认的 std 仿函数。

于 2013-09-02T07:32:10.367 回答
2

使用 Boost Range 适配器:

int main()
{
    const std::vector<int> v { 1,2,3,-99,4 };

    boost::copy(v | filtered([](int i) { return i > 0; }),
            std::ostream_iterator<int>(std::cout, "\n"));
}

在 Coliru上现场观看

也使用一点 Boost Phoenix:

int main()
{
    const std::vector<int> v { 1,2,3,-99,4 };

    boost::for_each(v | filtered(arg1 % 2 == 0), std::cout << arg1 << "\n");
}

在 Coliru 上观看现场直播

于 2013-09-02T07:42:23.060 回答