C++ 将对象向量中的元素复制到具有此元素的向量中

Posted

技术标签:

【中文标题】C++ 将对象向量中的元素复制到具有此元素的向量中【英文标题】:C++ Copy elements from an object vector into a vector with this element 【发布时间】:2017-02-22 13:57:07 【问题描述】:

我想将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,然后配置文件以确保它实际上是一个瓶颈,然后再尝试优化它。 无论您做什么,在添加任何内容之前,请在somenumbers 上致电reserve 【参考方案1】:

你是什么意思最快?只是循环,或算法,或其他东西。例如:

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

另外,既然你知道向量的大小 - 你应该打电话给reserve。

【讨论】:

【参考方案2】:
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 can be found here.)

用法:

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

【讨论】:

【参考方案3】:

当您承诺使用 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。

【讨论】:

以上是关于C++ 将对象向量中的元素复制到具有此元素的向量中的主要内容,如果未能解决你的问题,请参考以下文章

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

关于将元素插入向量的 C++ 问题

C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?

如何在 C++ 中将一个对象从一个向量复制到另一个向量?

如何清除向量中的所有元素,除了C++中向量中的最后一个元素

C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法