C 从对象向量将元素复制到带有此元素的向量
C++ Copy elements from an object vector into a vector with this element
我想将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。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 在 C++ 中输出枚举类类型的向量元素
- 用向量的向量元素初始化向量的空向量
- 为什么不允许使用可变长度数组作为向量元素?
- 在函数中传递向量元素
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 返回向量元素的 l 值的正确方法是什么?
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何在C++中从一个向量元素减去std::unorderede_map向量元素并更新它
- C++:向量元素赋值导致访问冲突
- 将向量元素与字符串元素进行比较,而不初始化向量
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 使用递归C++向量元素的总和
- 如何查找为数组中的最低值编制索引的向量元素
- 限制指针访问STL ::向量元素
- 访问索引指向向量元素时的seg故障 - 做错了什么
- 如何使用指针访问向量元素的各个元素
- 向量元素数据损坏了Find()操作
- 将字符值分配给向量元素.C