我有一个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)
但是,对于这样的简单用例,这很快就会导致代码难以处理,因为很难将所有相关功能整齐地保存在一起.