有条理地迭代一些项目

时间:2013-09-02 07:21:41

标签: c++ boost std c++98

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

Functors非常灵活,你可以将它变为寺庙,或者你可以在构造函数中将参数传递给它。

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

答案 1 :(得分: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"));
}

live on 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");
}

请参阅that live on Coliru

相关问题