从函数应用程序创建 std::vector

create std::vector from function application

本文关键字:vector std 创建 函数 应用程序      更新时间:2023-10-16

给定对象的向量v1,以及对其进行操作的函数,返回一个值,

std::vector<OBJ> v1; // already filled
bool foo(const OBJ&);

从对v1的每个元素应用foo来创建vector<bool> v2的最干净方法是什么?我宁愿不编写循环,但我在 STL 中找不到合适的命令。

听起来像是std::transform的工作。

当然有一个循环,但它是transform的实现细节。

例:

#include <vector>
#include <algorithm>
template<typename Obj, typename IsTrue>
std::vector<bool> truth(std::vector<Obj> const& v, IsTrue&& truth_func)
{
auto result = std::vector<bool>(v.size());
std::transform(std::begin(v), std::end(v), 
std::begin(result), 
std::forward<IsTrue>(truth_func));
return result;
}

int main()
{
std::vector<int> v { 1, 2, 3, 4, 5 };
auto is_even = [](auto&& x)
{
return (x % 2) == 0;
};
auto vb = truth(v, is_even);
}

我完全同意使用std::transform的解决方案。但是,我们可以使用更简单的std::for_each()来做到这一点<algorithm>.

我们考虑向量vec的每个元素(这是你的OBJ(,insert下一个向量v的后端/末端从foo()返回bool

如下所示。这是实景拍摄: https://www.ideone.com/pyfqmF

#include <algorithm>
#include <iostream>
#include <vector>
using OBJ = int;
bool foo(const OBJ& a)
{ return a == 1; }
int main()
{
std::vector< OBJ > vec = {1, 2, 3, 4};
std::vector< bool > v;
v.reserve(vec.size());
std::for_each(vec.begin(), vec.end(), [&v](const OBJ& a)->void
{
v.insert(v.end(), foo(a) );
});
for(auto const& it: v) std::cout << it << std::endl;
return 0;
}
相关文章: