我在stackoverflow上找不到这个问题。但我想知道人们如何使用STL(没有花哨的提升)......只是一个时尚STL。技巧/小贴士/大多数情况下使用的案例多年来......也许还有很多......
让我们分享一下......
每个答案一个提示......代码示例 -
编辑这是一个如此糟糕的问题,因为它导致了downvotes?
答案 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
内容:bind1st
,bind2nd
,mem_fun
,equal_to
等,如果出于某种原因无法访问,则非常有用促进绑定。
这是一个非常主观的问题,很大程度上取决于您的团队编码风格,项目类型和其他未知因素。
答案 8 :(得分:1)
没有最常用的STL算法,谓词或迭代器。这就像问C ++语言中最常用的运算符是什么。您经常使用什么,operator+
或operator-
?您更喜欢if
到while
吗?或者也许到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感知设计经验的程序员。
(请随意指出优缺点/缺陷,我会更新答案。)