最常用的是STL算法,谓词,迭代器

时间:2009-03-12 22:18:55

标签: c++ stl

我在stackoverflow上找不到这个问题。但我想知道人们如何使用STL(没有花哨的提升)......只是一个时尚STL。技巧/小贴士/大多数情况下使用的案例多年来......也许还有很多......

让我们分享一下......

每个答案一个提示......代码示例 -

编辑这是一个如此糟糕的问题,因为它导致了downvotes?

11 个答案:

答案 0 :(得分:9)

我最喜欢的是以下内容,可以将任何可流动的内容更改为字符串:

template <class TYPE> std::string Str( const TYPE & t ) {
    std::ostringstream os;
    os << t;
    return os.str();
}

然后:

string beast = Str( 666 );

答案 1 :(得分:7)

我在几乎所有的项目中使用STL,从循环(使用迭代器)到将输入分成程序。

用空格对输入字符串进行标记,并将结果输入到std :: vector中以便稍后进行解析:

std::stringstream iss(input);
std::vector<std::string> * _input = new std::vector<std::string>();

std::copy(std::istream_iterator<std::string>(iss), 
          std::istream_iterator<std::string>(), 
          std::back_inserter<std::vector<std::string> >(*_input));

其他收藏夹当然是std :: reverse和<algorithm>中定义的各种其他算法。

答案 2 :(得分:6)

使用vector替换指针+ new。这太棒了。

答案 3 :(得分:6)

我喜欢istream_iterator和ostream_iterator。

读取流并使其看起来像任何其他容器的简单方法:

// Copies a stream of integers on the std input
// into a vector.
int main()
{
    std::vector<int>    data;
    std::copy(std::istream_iterator<int>(std::cin),
              std::istream_iterator<>(),
              std::back_inserter(data)
             );

    // By uisng the istream_iterator<> the input just becomes another container.
}

答案 4 :(得分:4)

我喜欢矢量。这就是C ++数组应该的原因。我做了很多实时工作。不需要确定性的人可能更喜欢列表。

几乎每个人都使用了字符串。

我没有太多使用算法,因为我们仍然在这里使用VS6(它无法处理复杂的模板实例)。那将很快过去。

答案 5 :(得分:3)

最有用的算法(恕我直言) - std :: for_each

答案 6 :(得分:2)

我不记得有一个最喜欢或最常用的算法/谓词/迭代器,只是那个我当时想要完成的工作做得最好的那个。

答案 7 :(得分:2)

functional内容:bind1stbind2ndmem_funequal_to等,如果出于某种原因无法访问,则非常有用促进绑定。

这是一个非常主观的问题,很大程度上取决于您的团队编码风格,项目类型和其他未知因素。

答案 8 :(得分:1)

没有最常用的STL算法,谓词或迭代器。这就像问C ++语言中最常用的运算符是什么。您经常使用什么,operator+operator-?您更喜欢ifwhile吗?或者也许到throw

必须使用时,一切都会被使用。

PS:我建议你在提出这些问题之前阅读Scott Meyers的Effective STL

答案 9 :(得分:1)

问画家“你最喜欢/最常用的刷子是什么?” :)

答案 10 :(得分:1)

以下内容有些“邪恶”,但它使我们免于许多错误。

(更新,感谢@ Ricky65的评论让我回到这里。)如果你的编译器支持它,C ++ 11有一个range-based for loop远远优于它。不过,我们仍然使用一些真正的旧编译器。

#define FOREACH(iter,stlContainer)  \
for ( typeof(stlContainer.begin()) iter = stlContainer.begin(), \
                                   iter##End_Cached = stlContainer.end(); \
      iter != iter##End_Cached; \
      ++iter )

(进一步更新,归功于Boost开发者。)它基于更复杂但更强大的BOOST_FOREACH宏,但具有在小型案例的调试版本中更容易逐步完成的优势,并且不需要一小堆boost标题(在某些代码库/组中是禁止的)。

通常优先使用std::for_each,但有一些缺点:

  • 用户必须了解bind1st / bind2nd / ptr_fun / mem_fun之间的互动,以便有效地将其用于非平凡的“访问” - 提升修复程序很多这些问题,但不是每个人都有或知道提升
  • 用户可能需要为单个使用点提供自己独立的仿函数(通常是结构);所述结构不能在循环周围的函数内声明,导致相关代码的“非局部性” - 在某些情况下,它不会读取逻辑与函数其余部分的流程一致
  • 它并不总是很好地内联,具体取决于编译器

上面列出的FOREACH宏提供了一些东西:

  • std::for_each类似,你不会让你的边界测试错误(没有经过一次迭代,等等)
  • 它将使用const_iterators而不是常量容器

请注意,它确实需要一些非标准的“typeof”扩展名。

典型用法可能是:

list< shared_ptr< Thing > > m_memberList;
// later
FOREACH( iter, m_memberList )
{
   if ( (*iter)->getValue() < 42 ) {
      doSomethingWith( *iter );
   }
}

我对这个宏并不完全满意,但它在这里非常宝贵,特别是对于没有STL感知设计经验的程序员。

(请随意指出优缺点/缺陷,我会更新答案。)