gpt4 book ai didi

c++ - 清除匹配元素的 for 循环

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:06 24 4
gpt4 key购买 nike

我发现我编写的很多代码一般都遵循“循环遍历此容器并对符合某些条件的元素执行 X”的模式。

通常看起来像这样:

std::vector<int> theList(10);
std::iota(theList.begin(), theList.end(), 0);

for (auto i : theList)
{
if ((i % 2) == 0)
{
//Do something with i
}
}

我不喜欢这些情况下的 if 语句 - 它们很丑陋并且有损于循环逻辑中真正发生的事情。

我想要的是一种更好的方法来做到这一点,以便很好地表达问题的核心。

到目前为止,我最好的尝试并不是那么好:

std::vector<int> theList(10);
std::iota(theList.begin(), theList.end(), 0);

auto criteria = [](const int& i) -> bool { return (i % 2) == 0; };

for (auto it = std::find_if(theList.begin(), theList.end(), criteria);
it != theList.end();
it = std::find_if(++it, theList.end(), criteria)
)
{
std::cout << *it << ", ";
}

感觉这种模式应该以一种更简洁的方式进入 std::algorithm

有更好的方法吗?

最佳答案

您可以为此创建一个简单的高阶函数:

template <typename Range, typename Predicate, typename F>
void for_items_matching(Range&& r, Predicate&& p, F&& f)
{
for(auto&& x : r)
{
if(p(x)) { f(x); }
}
}

使用示例:

auto criteria = [](const int& i) -> bool { return (i % 2) == 0; };
for_items_matching(theList, criteria, [](auto&& item)
{
std::cout << item << ", ";
})

通过一些重构和辅助类/函数,您最终可能会得到如下结果:

for_items_of(theList)
.matching(criteria)
.execute([](auto&& item){ std::cout << item << ", "; });

另一种可能性是关注即将到来的 Ranges TS

关于c++ - 清除匹配元素的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com