gpt4 book ai didi

c++ - 如何结合 std::copy_if 和 std::transform?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:10 30 4
gpt4 key购买 nike

考虑以下代码片段:迭代第一种类型 T1 的一个容器以创建第二种类型 T2 的第二个容器,应用转换函数 T1->T2 但仅适用于验证谓词的 T1 元素 (T1 -> bool )

(在下面的例子中是奇数)。

std::vector<int> myIntVector;
myIntVector.push_back(10);
myIntVector.push_back(15);
myIntVector.push_back(30);
myIntVector.push_back(13);

std::vector<std::string> myStringVectorOfOdd;

std::for_each(myIntVector.begin(), myIntVector.end(),
[&myStringVectorOfOdd](int val)
{
if (val % 2 != 0)
myStringVectorOfOdd.push_back(std::to_string(val));

});

我不喜欢这段代码的地方是对 lambda 的捕获。有没有办法结合 std::copy_if 和 std::transform 以更优雅和简洁的方式实现相同的结果?

最佳答案

这是一个 transform_if 模板,它采用通常的输入迭代器对、一个输出迭代器和一个谓词以及一个转换函数对象。

template <class InputIt, class OutputIt, class Pred, class Fct>
void transform_if(InputIt first, InputIt last, OutputIt dest, Pred pred, Fct transform)
{
while (first != last) {
if (pred(*first))
*dest++ = transform(*first);

++first;
}
}

您可以将它用于您的示例,如下所示。

transform_if(myIntVector.cbegin(), myIntVector.cend(),
std::back_inserter(myStringVectorOfOdd),
[](int n){ return n % 2 != 0; },
[](int n){ return std::to_string(n); });

它不是 super 简洁,但过滤和转换很好地分离到无捕获的 lambda 中,并且算法本身惯用迭代器。

由于范围库对组合算法提供了更好的支持,这里同样基于Boost range :

#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

using boost::adaptors::filtered;

boost::transform(myIntVector | filtered([](int n){ return n % 2 != 0; }),
std::back_inserter(myStringVectorOfOdd), [](int n){ return std::to_string(n); });

关于c++ - 如何结合 std::copy_if 和 std::transform?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52400746/

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