STL有多少太多了?

Dar*_*kas 6 c++ stl coding-style

我正在使用很多STL代码std::for_each,bind等等,但我注意到有时STL使用不是好主意.

例如,如果您有一个std::vector并且想要对向量的每个项目执行一个操作,那么您的第一个想法是使用此:

std::for_each(vec.begin(), vec.end(), Foo())
Run Code Online (Sandbox Code Playgroud)

它很优雅,很好,有一段时间了.但随后出现了第一组错误报告,您必须修改代码.现在你应该添加参数来调用Foo(),所以它现在变成:

std::for_each(vec.begin(), vec.end(), std::bind2nd(Foo(), X))
Run Code Online (Sandbox Code Playgroud)

但这只是暂时的解决方案.现在项目已经成熟,您可以更好地理解业务逻辑,并且希望对代码添加新的修改.在这一点上,你意识到你应该使用旧的好处:

for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
Run Code Online (Sandbox Code Playgroud)

这只发生在我身上吗?你在代码中认识到这种模式吗?您是否经历过类似的反模式使用STL

Bri*_*ndy 10

使用boost :: bind和std :: for_each以一种干净的方式解决了这个问题.或者你可以使用BOOST_FOREACH.

std :: for_each的示例:

std::for_each(v.begin(), v.end(), boost::bind(&C::f, _1, param));
Run Code Online (Sandbox Code Playgroud)

BOOST_FOREACH示例:

std::list<int> list_int( /*...*/ );
BOOST_FOREACH( int i, list_int )
{
    // do something with i
}
Run Code Online (Sandbox Code Playgroud)

  • 不,此时您重新考虑需要函数具有10个参数的体系结构;) (2认同)

Gre*_*ers 10

它也可以采用相反的方式.假设您从一个只需要几行的操作开始.你不想打扰创建一个只调用一次的函数,只是为了压缩循环,所以你写了类似的东西:

for ()
{
    // do
    // some
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

然后,当你需要执行的操作变得更复杂时,你会意识到将它拉入一个单独的函数是有道理的,所以你最终得到了

for ()
    do_alot_more_stuff();
Run Code Online (Sandbox Code Playgroud)

然后修改它就像你的原始方法有意义进一步浓缩它:

std::for_each(begin, end, do_alot_more_stuff);
Run Code Online (Sandbox Code Playgroud)

最后,真正将for_each更改为for循环有多难,反之亦然?不要因为微小的细节而殴打自己!


Dav*_*ley 5

像任何其他语言工具一样使用它.当它让您的生活更轻松时,请使用它.当它变得麻烦时,做其他事情.当需求发生变化时,并不是很难以某种方式重构循环.