C 从对象向量将元素复制到带有此元素的向量

C++ Copy elements from an object vector into a vector with this element

本文关键字:向量 元素 复制 对象      更新时间:2023-10-16

我想将a值从foos向量复制到具有int值的另一个向量。最快的方法是什么?

#include <vector>
struct Foo {
   int a;
};
int main() {
   std::vector<Foo> foos;
   for(int i = 0; i < 100; i++)
      foos[i].a = i;
   std::vector<int> somenumbers;
   //Fastest way to copy the ints from the struct into the somenumbers vector?  
   return 0;
}

您最快的意思是什么?只是循环,算法或其他内容。例如:

std::transform
(
    foos.begin(), foos.end(), std::back_inserter(somenumbers),
    [](const Foo& v) { return v.a; }
);

另外,由于您知道向量的大小 - 您应该呼叫。

somenumbers.reserve(foos.size());
for(const auto& f : foos) somenumbers.emplace_back(f.a);

如果您在代码库中多次进行此操作,请引入抽象:

template <typename TRange, typename TF>
auto map_vector(TRange&& range, TF&& f)
{
    using type = std::decay_t<decltype(f(*std::begin(range)))>;
    std::vector<type> result;
    result.reserve(range.size());
    for(auto&& x : range) result.emplace_back(forward_like<TRange>(x));
    return result;
}

(可以在此处找到forward_like。)

用法:

auto somenumbers = map_vector(foos, [](const auto& x){ return x.a; });

当您使用boost:

时,也有密集/单线解决方案
#include <boost/iterator/transform_iterator.hpp>
const std::vector<int> extraction{
    boost::make_transform_iterator(instances.cbegin(), std::mem_fn(&Foo::a)),
    boost::make_transform_iterator(instances.cend(), std::mem_fn(&Foo::a))
};

传递给make_transform_iterator的函数对象也可以是lambda。