从std :: vector中的每个结构中选择一个成员到另一个向量中

Pau*_*ulH 13 c++ stl

我有一个Visual Studio 2008 C++项目,我想将该结构类型的向量的一个struct元素复制到一个新的向量.例如:

struct Foo {
    int a;
    long b;
};

std::vector< Foo > v1;
std::vector< long > v2;

for( std::vector< Foo >::const_iterator it = v1.begin(); it != v1.end(); ++it )
{
    v2.push_back( it->b );
}
Run Code Online (Sandbox Code Playgroud)

有比这更好/更优雅的方式吗?

谢谢,PaulH

Jam*_*lis 18

在Visual C++ 2008中,不,这就像它获得的"优雅"一样.标准库提供了可用于操作容器的算法,但在大多数情况下 - 特别是在像这样的简单用例中 - 它们使用起来太麻烦了.

C++ 11将lambda表达式添加到C++中.Visual C++ 2010和其他C++编译器的最新版本支持此C++ 11功能.使用lambda表达式,您可以轻松地将transform算法用于您的任务:

std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
               [](Foo const& x) { return x.b; });
Run Code Online (Sandbox Code Playgroud)

如果没有lambda表达式,则必须定义一个b从结构中提取元素的函数:

long get_b(Foo const& x) { return x.b; }
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此函数与transform算法一起使用:

std::transform(v1.begin(), v1.end(), std::back_inserter(v2), get_b);
Run Code Online (Sandbox Code Playgroud)

但是,对于这样的简单用例,这很快就会导致代码难以处理,因为很难将所有相关功能整齐地保存在一起.

  • 您也可以使用`std :: bind(&Foo :: b)`来获取签名`long&(Foo&)`的函数. (2认同)