从类实例向量中提取类成员(作为新向量)

Ken*_*eld 1 c++ stl initialization

我有一个类/结构如下:

struct MyStruct {
  std::string member_one;
  std::string member_two;
};
Run Code Online (Sandbox Code Playgroud)

我创建了一个长度为vector的向量MyStruct,其成员设置为自定义值:std::vector<MyStruct>N

std::vector<MyStruct> my_struct_vect(10);
// initialize class instances
Run Code Online (Sandbox Code Playgroud)

现在我想将第一个成员提取memberOne到一个新的向量中.我可以这样做:

std::vector<std::string> member_one_vect(my_struct_vect.size());
for (size_t i = 0; i < my_struct_vect.size(); ++i) {
  member_one_vect[i] = my_struct_vect[i].member_one;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有更快/更优雅/更清洁的方式,而无需每次都编写自定义循环?例如,在Python中,我可以通过理解很容易地做到这一点.我不希望在C++中有类似的东西,但我想知道是否有某种方法可以简化这一点.

更新

感谢使用std::transform和使用的响应boost::adaptors::transformed.这些非常有用,但为了紧凑,值得注意的是它们依赖于C++ 11中引入的lambda函数(可以不使用它们,但这需要定义一个单独的辅助函数).

那么对于奖励积分,有没有办法在C++ 03中以紧凑的方式做到这一点?

And*_*owl 5

你可以使用std::transform:

#include <algorithm> // Necessary for std::transform()

// ...

std::vector<std::string> member_one_vect(my_struct_vect.size());

std::transform(
    my_struct_vect.begin(), my_struct_vect.end(), member_one_vect.begin(),
    [] (MyStruct const& ms)
{
    return ms.member_one;
});
Run Code Online (Sandbox Code Playgroud)

以下是完整代码的外观:

#include <vector>
#include <string>
#include <algorithm>

struct MyStruct {
  std::string member_one;
  std::string member_two;
};

int main()
{
    std::vector<MyStruct> my_struct_vect(10);

    // Initialize my_struct_vect...

    std::vector<std::string> member_one_vect(my_struct_vect.size());

    std::transform(
        my_struct_vect.begin(), my_struct_vect.end(), member_one_vect.begin(),
        [] (MyStruct const& ms)
    {
        return ms.member_one;
    });

    // Do something with member_one_vect...
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.