从另一个矢量类型中包含的组件构建矢量

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可以帮助我,但我不确定如何写这个.

我也很有兴趣,如果提升有什么在这里提供.

Mic*_*fik 7

如果您有TR1或Boost可用,您可以尝试这样做:

std::transform(secondVec.begin(),
               secondVec.end(),
               std::back_inserter(firstVec),
               std::tr1::bind(&Second::s1, _1));
Run Code Online (Sandbox Code Playgroud)


Kir*_*sky 5

定义将第二个转换为第一个的仿函数:

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)