std :: copy的自定义插入器
问题描述:
给定一个保存MyClass的对象的std::vector
。如何使用std::copy
创建另一个只包含MyClass成员数据的向量?我想我将不得不实施一个自定义back_inserter
,但我不知道如何做到这一点。std :: copy的自定义插入器
struct MyClass {
int a;
}
std::vector<MyClass> vec1;
// I could copy that to another vector of type MyClass using std::copy.
std::copy(vec1.begin(), vec1.end(); std::back_inserter(someOtherVec)
// However I want just the data of the member a, how can I do that using std::copy?
std::vector<int> vec2;
答
std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2),
[](const MyClass& cls) { return cls.a; });
(如果你不能使用C++ 11,你可以做一个函数对象自己:
struct AGetter { int operator()(const MyClass& cls) const { return cls.a; } };
std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2), AGetter());
或使用std::tr1::bind
如果你可以使用TR1:
std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2),
std::tr1::bind(&MyClass::a, std::tr1::placeholders::_1));
顺便说一句,作为@Nawaz评论如下,做一个.reserve()
,以防止副本期间不必要的重新分配。
vec2.reserve(vec1.size());
std::transform(...);
答
你想用std::transform
不std::copy
和std::bind
绑定到一个指针指向一个成员变量:
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
#include <functional>
struct foo {
int a;
};
int main() {
const std::vector<foo> f = {{0},{1},{2}};
std::vector<int> out;
out.reserve(f.size());
std::transform(f.begin(), f.end(), std::back_inserter(out),
std::bind(&foo::a, std::placeholders::_1));
// Print to prove it worked:
std::copy(out.begin(), out.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
我的例子是C++ 11,但如果你跳过得心应手矢量initalization和使用boost::bind
而不用C++ 11就可以。
'std :: copy'用于普通复制,不需要修改元素。 'std :: transform'允许您对每个元素应用转换,然后存储转换的输出。这正是你想要的。 :) – jalf 2012-07-27 11:37:43
哇很多的答案,thx! – Nils 2012-07-27 11:40:58