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)
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循环有多难,反之亦然?不要因为微小的细节而殴打自己!