10

给定一个std::vector包含 MyClass 对象的 a。如何使用创建另一个仅包含 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;
4

2 回答 2

18

为此使用std::transform

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(...);
于 2012-07-27T11:36:39.280 回答
4

您想使用std::transformnotstd::copystd::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,但是如果您跳过方便的向量初始化并改用boost::bind它,那么在没有 C++11 的情况下也可以正常工作。

于 2012-07-27T11:39:31.597 回答