代码之家  ›  专栏  ›  技术社区  ›  Darius Kucinskas

STL的多少是太多了?[闭门]

  •  6
  • Darius Kucinskas  · 技术社区  · 15 年前

    我用了很多钱 STL 编码 std::for_each , bind ,等等,但我注意到有时候 STL

    例如,如果您有 std::vector 如果你想对向量的每一项做一个动作,你的第一个想法是:

    std::for_each(vec.begin(), vec.end(), Foo())
    

    暂时来说,它是优雅的,还可以。但是接下来是第一组bug报告,您必须修改代码。现在您应该为调用添加参数 Foo() ,所以现在变成:

    std::for_each(vec.begin(), vec.end(), std::bind2nd(Foo(), X))
    

    但这只是暂时的解决办法。现在,项目已经成熟,您对业务逻辑的理解也更好了,并且希望对代码添加新的修改。正是在这一点上,你意识到你应该使用旧的好:

    for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
    

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

    9 回复  |  直到 14 年前
        1
  •  10
  •   Brian R. Bondy    15 年前

    使用 boost::bind 使用std::for_,每个都以一种干净的方式解决了这个问题。或者你可以使用 BOOST_FOREACH .

    std::for_各自的示例:

    std::for_each(v.begin(), v.end(), boost::bind(&C::f, _1, param));
    

    BOOST_FOREACH的示例:

    std::list<int> list_int( /*...*/ );
    BOOST_FOREACH( int i, list_int )
    {
        // do something with i
    }
    
        2
  •  10
  •   BenMorel Pankaj Kumar    11 年前

    不过,它也可以走相反的路。假设您从一个只需要几行代码的操作开始。您不想费心创建一个只调用一次的函数,只是为了压缩循环,所以您可以编写如下代码:

    for ()
    {
        // do
        // some
        // stuff
    }
    

    然后,当您需要执行的操作变得更加复杂时,您会意识到将其拉入单独的函数是有意义的,因此您最终会

    for ()
        do_alot_more_stuff();
    

    然后将其修改为与原始方法相同,以便进一步精简:

    std::for_each(begin, end, do_alot_more_stuff);
    

        3
  •  5
  •   David Thornley    15 年前

    像使用其他语言工具一样使用它。当它让你的生活更轻松时,就用它吧。当它变得麻烦时,做些别的事情。当需求发生变化时,以这种或那种方式重构循环并不是很难。

        4
  •  3
  •   Joris Timmermans    15 年前

    与你的问题类似,我经常注意到C++中的“函子”模式/习惯用法实际上是笨拙的。这就是我期待的原因 Lambda Functions

        5
  •  2
  •   T.E.D.    15 年前

    我对算法中的很多东西也有同样的问题。它有一种令人讨厌的倾向,最终会被 更多

    我无法证明,我们可以用适当的构造函数和析构函数,以及一些访问器来证明一个特殊的函子类(这是C++中一个中等的高级主题,它不能完全理解),只是为了避免循环的一行。

        6
  •  1
  •   Edouard A.    15 年前

    也许你一开始就用了_each而不是transform。。。

        7
  •  1
  •   Benoît photo_tom    15 年前

    我从不使用std::for_(或者很少)。

    我建议使用 Boost.Foreach 和经典的“for”结构。当C++ 0x出来时,可以考虑使用新的“OF”构造,使其更易于读取容器。

        8
  •  0
  •   Greg Domjan    15 年前

        9
  •  0
  •   tstenner    15 年前

    或者您可以等待C++0x并使用 for(elem& e, container){e.something();}
    BOOST_FOREACH() ,但这是标准的一部分(在某些年份…)。