用于std :: copy的自定义插入器

Nil*_*ils 9 c++ std

给定一个std::vector包含MyClass的对象.如何创建另一个向量,该向量仅包含一个MyClass成员的数据std::copy?我想我必须实现一个自定义,back_inserter但到目前为止我无法弄清楚如何做到这一点.

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;
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 17

使用std::transform了点.

std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2),
               [](const MyClass& cls) { return cls.a; });
Run Code Online (Sandbox Code Playgroud)

(如果你不能使用C++ 11,你可以自己创建一个函数对象:

struct AGetter { int operator()(const MyClass& cls) const { return cls.a; } };

std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2), AGetter());
Run Code Online (Sandbox Code Playgroud)

或使用,std::tr1::bind如果你可以使用TR1:

std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2),
               std::tr1::bind(&MyClass::a, std::tr1::placeholders::_1));
Run Code Online (Sandbox Code Playgroud)

BTW,正如@Nawaz在下面评论的那样,做了一个.reserve()以防止在复制过程中不必要的重新分配.

vec2.reserve(vec1.size());
std::transform(...);
Run Code Online (Sandbox Code Playgroud)