我的代码看起来像这样:
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 在此提供任何内容,我也会感兴趣。
答案 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))