Ala*_*lan 4 c++ algorithm boost stl
我有一个看起来像这样的代码:
struct First
{
int f1;
int f2;
};
struct Second
{
First s1;
int s2;
};
std::vector < Second > secondVec;
Second sec;
sec.s1 = First();
secondVec.push_back(sec);
secondVec.push_back(sec);
std::vector < First > firstVec;
firstVec.reserve(secondVec.size());
for (std::vector < Second >::iterator secIter = secondVec.begin();
secIter != = secondVec.end();
++secIter)
{
firstVec.push_back(secIter->s1);
}
Run Code Online (Sandbox Code Playgroud)
我想for用一个简单的stl函数替换这个丑陋的循环,它可能执行等效的过程.我在想,也许std::transform可以帮助我,但我不确定如何写这个.
我也很有兴趣,如果提升有什么在这里提供.
如果您有TR1或Boost可用,您可以尝试这样做:
std::transform(secondVec.begin(),
secondVec.end(),
std::back_inserter(firstVec),
std::tr1::bind(&Second::s1, _1));
Run Code Online (Sandbox Code Playgroud)
定义将第二个转换为第一个的仿函数:
struct StoF { First operator()( const Second& s ) const { return s.s1; } };
Run Code Online (Sandbox Code Playgroud)
然后以下列方式使用它:
transform( secondVec.begin(), secondVec.end(), back_inserter(firstVec), StoF() );
Run Code Online (Sandbox Code Playgroud)
如果您的源向量包含许多元素,您应该考虑调整目标向量的大小以使其更快地工作,如@Goz回答:
firstVec.resize( secondVec.size() );
transform( secondVec.begin(), secondVec.end(), firstVec.begin(), StoF() );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |