我在我的代码中迭代了很多这样的项目:
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);
}
}
答案 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"));
}
使用一点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");
}