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

C++ 从函数应用程序创建std::vector,c++,algorithm,c++11,stl,stdvector,C++,Algorithm,C++11,Stl,Stdvector,给定对象的向量v1,以及对其进行操作并返回值的函数 std::vector<OBJ> v1; // already filled bool foo(const OBJ&); std::vector v1;//已满 布尔福(const OBJ&); 从foo应用到v1的每个元素,创建向量v2的最干净方法是什么?我不想写循环,但在STL中找不到合适的命令。听起来像是std::transform的工作 当然有一个循环,但它是transform的一个实现细节 例如: #inclu

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

std::vector<OBJ> v1; // already filled
bool foo(const OBJ&);
std::vector v1;//已满
布尔福(const OBJ&);

foo
应用到
v1
的每个元素,创建
向量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);
}
#包括
#包括
模板
标准::向量真值(标准::向量常量与v、IsTrue与真值函数)
{
自动结果=标准::向量(v.size());
std::transform(std::begin(v),std::end(v),
标准::开始(结果),
转发(真值函数);
返回结果;
}
int main()
{
std::向量v{1,2,3,4,5};
自动为偶数=[](自动和x)
{
返回(x%2)==0;
};
自动vb=真值(v,是偶数);
}

我完全同意使用
std::transform
的解决方案。但是,我们可以使用更简单的
std::for_each()
from

#包括
#包括
#包括
使用OBJ=int;
布尔福(康斯特建筑事务所)
{返回a==1;}
int main()
{
std::vectorvec={1,2,3,4};
std::vectorv;
v、 保留(向量大小());
std::for_each(vec.begin()、vec.end()、[&v](const OBJ&a)->void
{
v、 插入(v.end(),foo(a));
});

对于(auto-const&it:v)std::cout可能需要看一看。谢谢。因此,设置向量大小可能比使用back\u插入器更快?@rwst使用
back\u插入器
依赖于向量本身的扩展(并可能复制其所有数据)当它达到容量时。对于一个巨大的向量,它的摊销成本是恒定的,而且非常低,因为向量以几何方式扩展,但它仍然不是零。但是如果你用非常小的向量来做这件事无数次,而不是用一个巨大的向量来做一次,就没有时间摊销了。你可以在一个5-e中添加一个4元素的副本每次都要执行一次元素操作,成本几乎翻了一番。更不相关的是:这可以并行执行吗,可能是用C++17吗?我的意思是,对象是只读的,所以原则上应该可以工作?@rwst这是标准的,是的。还不是所有的stdlib实现都支持并行操作。您的里程数可能会有所不同。请参阅第4节:
#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;
}