我有一个Visual Studio 2008 C++项目,在这里我想将该结构类型的 vector 的一个struct元素复制到一个新的 vector 中。例如:

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 );
}

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

谢谢,
保罗·H

最佳答案

在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; });

如果没有lambda表达式,则必须定义一个函数以从struct中提取b元素:
long get_b(Foo const& x) { return x.b; }

然后,您可以将此函数与transform算法一起使用:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2), get_b);

但是,对于像这样的简单用例,由于很难将所有相关功能整齐地保持在一起,因此这会很快导致代码笨拙。

09-10 01:27
查看更多