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

时间:2009-08-03 13:15:10

标签: c++ algorithm stl boost

我的代码看起来像这样:

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

我想用一个简单的stl函数替换这个丑陋的for循环,它可能执行等效的过程。我在想,也许std::transform可以帮助我,但我不确定如何写这个。

如果 boost 在此提供任何内容,我也会感兴趣。

4 个答案:

答案 0 :(得分:7)

如果你有TR1或Boost可用,你可以试试这个:

std::transform(secondVec.begin(),
               secondVec.end(),
               std::back_inserter(firstVec),
               std::tr1::bind(&Second::s1, _1));

答案 1 :(得分:5)

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

struct StoF { First operator()( const Second& s ) const { return s.s1; } };

然后按以下方式使用它:

transform( secondVec.begin(), secondVec.end(), back_inserter(firstVec), StoF() );

如果您的源向量包含很多元素,您应该考虑调整目标向量的大小以使其更快地运行,如@Goz回答:

firstVec.resize( secondVec.size() );
transform( secondVec.begin(), secondVec.end(), firstVec.begin(), StoF() );

答案 2 :(得分:3)

它并不是特别困难......我试过这个并没有问题。

struct First
{
    int f1;
    int f2;
};

struct Second
{
    First s1;
    int s2;
};

First Replace( Second& sec )
{
    return sec.s1;
}

然后使用以下代码复制它

std::vector < Second > secondVec;

Second sec;
sec.s1.f1 = 0; 
sec.s1.f2 = 1; 
secondVec.push_back(sec);

sec.s1.f1 = 2; 
sec.s1.f2 = 3; 
secondVec.push_back(sec);

std::vector < First > firstVec;
firstVec.resize( secondVec.size() );
std::transform( secondVec.begin(), secondVec.end(), firstVec.begin(), Replace );

答案 3 :(得分:2)

你的直觉是正确的。虽然由于使用的是空向量,但应该使用后插入器作为输出迭代器。

看起来应该是类似的东西:

std::transform(secondVec.being(), secondVec.end(), back_inserter(firstVec), yourFunctor)

你的朋友看起来像这样:

void youFunctor(First param)
{
  return param.s1;
}

编辑:Boost可以帮助您使用lambda函数,因此您不必为此任务创建单独的仿函数。您还应注意lambda函数函数是TR1的一部分,并将集成到C ++标准库中。

编辑:这是Meredith与mem_fun(或成员函数适配器)讨论的内容。

 struct Second
{
    First s1;
    int s2;
    First getS1() const {return s1;};
};

然后转换看起来像这样:

std::transform(secondVec.being(), 
               secondVec.end(), 
               std::back_inserter(firstVec), 
               std::mem_fun(&Second::getS1))