
effective stl
codefreestyle
这个作者很懒,什么都没留下…
展开
-
针对MSVC4-6的解决方案
//不同的迭代器之间相互复制,这在老版本上不能通过编译 istream_iterator<int> begin(cin), end; vector<string> vs(begin, end); //笔者本地能编译通过,如果不能编译通过,则可使用下边的方法 istream_iterator<int> begin2(cin), end2; vector<strin原创 2016-10-05 22:21:12 · 299 阅读 · 0 评论 -
地域性与忽略大小写的字符串比较
#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;struct lt_noCase : public binary_function<char, char, bool>{ bool operator()(const char& a, const cha原创 2016-10-05 22:11:53 · 280 阅读 · 0 评论 -
文章标题
几个常用的stl站点:sgi stl站点:sgi stl站点stlPort站点STLport网站Boost网站,Boost网站(译注:如果访问不了,可以试试http://boost.sourceforge.net/)原创 2016-10-05 20:42:37 · 216 阅读 · 0 评论 -
effective stl 第49条:学会分析与STL相关的编译器诊断信息
string不是一个类,它是typedef。实际上,它是这个的typedef: basic_string < char, char_traits<char>, allocator<char> > ;因此,可以将所有的basic_string替换为string,举例如下: example.cpp(20): error C2664:’__thiscall std::basic_string//该原创 2016-10-05 20:21:57 · 260 阅读 · 0 评论 -
【待完善】inner_product/adjacent_difference/partial_sum的用法
几个函数用法的简要介绍原创 2016-10-05 19:45:30 · 256 阅读 · 0 评论 -
effective stl 第48条:总是包含(#include)正确的头文件
STL编程一件极其令人沮丧的事情是,在一个STL平台上顺利编译通过的,在另一个平台上可能需要额外的#include指令才能编译通过。● 几乎所有的容器都在同名的头文件里,比如,vector在中声明,list在中声明等。例外的是和。声明了set和multiset,声明了map和multimap。 ● 除了四个算法外,所有的算法都在中声明。例外的是accumulate(参见条款37)、inner_pr原创 2016-10-05 19:33:44 · 236 阅读 · 0 评论 -
effective stl 第47条:避免产生“直写型”的代码
#include<iostream>#include<vector>#include<iterator>#include<algorithm>#include<functional>using namespace std;//假设有一个vector<int>,现在想删除其中所有小于x的元素,但是//在最后一个其值不小于y的元素之前所有的元素都要留下//方法一:void Function原创 2016-10-05 19:28:24 · 327 阅读 · 0 评论 -
effective stl 第46条:考虑使用函数对象而不是函数作为STL算法的参数
void Function1(){ vector<double> v; //将函数对象传给sort() sort(v.begin(), v.end(), greater<double>());}void Function2(){ vector<double> v; //将函数传给sort() sort(v.begin(), v.end(), d原创 2016-10-05 19:00:31 · 326 阅读 · 0 评论 -
effective stl 第45条:正确区分count/find/binary_search/lower_bound/upper_bound/equal_range
查找信息:binary_search/lower_bound/upper_bound/equal_range/count/count_if/find/find_if如果迭代器区间的数据是有序的:建议使用binary_search/lower_bound/upper_bound/equal_range(使用等价性搜索) 如果迭代器区间的数据是无序的:建议使用count/count_if/find/f原创 2016-10-05 18:10:21 · 674 阅读 · 0 评论 -
effective stl 第44条:容器的成员函数优先于同名的算法
有些容器提供了一些与算法同名的成员函数,比如:关联容器提供了count/find/lower_bound/upper_bound和equal_range,而list则提供了remove/remove_if/unique/sort/merge/reverse.在多数情况下,应该使用成员函数。原因是:1、成员函数速度快。2.成员函数与容器结合的更加紧密,这是算法不能比的,并且同名的算法和成员函数所做的事原创 2016-10-05 16:12:03 · 415 阅读 · 0 评论 -
effective stl 第43条:算法调用优先于手写的循环
使用算法优先于手写的循环,理由如下: ● 效率:算法通常比程序员产生的循环更高效。 ● 正确性:写循环时比调用算法更容易产生错误。 ● 可维护性:算法通常使代码比相应的显式循环更干净、更直观。#include<iostream>#include<algorithm>#include<list>#include<functional>using namespace std;class Wi原创 2016-10-05 15:57:24 · 279 阅读 · 0 评论 -
effective stl 第42条:确保less<T>和operator<具有相同的语义
#include<iostream>#include<algorithm>#include<functional>#include<set>using namespace std;class Widget{public: size_t weight() const { } size_t maxSpeed() const { } bool原创 2016-10-05 13:36:30 · 455 阅读 · 0 评论 -
effective stl 第41条:理解ptr_fun/mem_fun/mem_fun_ref的由来
这三个函数的主要作用是掩盖C++语言中一个内在的语法不一致的问题。#include<iostream>#include<vector>#include<list>#include<algorithm>using namespace std;class Widgets{public: Widgets(){}; void test(){};private:};//假设是一个可原创 2016-10-05 11:42:47 · 329 阅读 · 0 评论 -
effective stl 第40条:若一个类是函数子,则应使他可配接
#include<iostream>#include<list>#include<algorithm>#include<functional>using namespace std;bool isInsteresting(const string* obj)//判断某个类型是否有趣{ if ((*obj)[4] % 7 == 0) { return true;原创 2016-10-05 10:39:54 · 387 阅读 · 0 评论 -
effective stl 第39条:确保判别式是“纯函数”
在C++中,纯函数所能访问的数据应该仅限于参数和常量(在函数的周期中不会被改变,自然的,这样的常量应该被声明为const).如果一个纯函数需要访问那些可能在两次调用之间发生变化的数据,那么用相同的参数在不同的时刻调用该函数就有可能得到不同的结果。判别式类:是一个函数的子类,他的operator()函数是一个判别式,也就是说,他的operator()返回true或者false.正如你所料,STL中凡事原创 2016-10-04 15:18:11 · 333 阅读 · 0 评论 -
effective stl 第38条:遵循按值传递的原则来设计函数子类
无论是C还是C++,都不允许将一个函数传递给另一个函数,相反,你必须使用函数指针,qsort函数就是这样的一个函数。void qsort(void* base, size_t nmemb, size_t size, int(*cmpfcn)(const void* a, const void *b));qsort是按值传递的,C++和C标准都遵循这个原则:函数指针是按值传递的。for_each是安置原创 2016-10-04 11:03:56 · 425 阅读 · 0 评论 -
effective stl 第37条:使用accumulate或者for_each进行区间统计
注意算法accumulate并不位于algorithm这个库文件中,它和其他三个“数值算法”存在于中,另外的三个算法依次是inner_product/adjacent_difference/partial_sum。#include<iostream>#include<algorithm>#include<numeric>#include<list>#include<iterator>#in原创 2016-09-29 21:11:02 · 530 阅读 · 0 评论 -
effective stl 第36条:理解copy_if的正确实现
STL 中有11个包含了copy的算法:copy copy_backward replace_copy_if reverse_copy replace_copy_if unique_copy remove_copy rotate_copy remove_copy_if partial_sort_copy uninitialized_copy但是copy_if却偏偏不在其中。下边是原创 2016-09-29 18:57:42 · 592 阅读 · 0 评论 -
effective stl 第35条:通过mismatch和lexicographical_compare实现简单的忽略大小写的字符串比较
新知识点:not1、not2、not3……not127 not1和not2例子: not1是构造一个与谓词结果相反的一元函数对象,not2是构造一个与谓词结果相反的二元函数对象#include<iostream>#include<algorithm>#include<vector>#include<functional>using namespace std;int ciCharCompar原创 2016-09-28 00:04:09 · 470 阅读 · 0 评论 -
effective stl 第34条:了解哪些算法需要使用排序的区间作为参数。
很多排序算法要求随机访问迭代器,所以对List的元素不可能调用这种算法。有些算法要求排序的区间,即区间中的值是排过序的。有些算法既可以与排序的区间一起工作,也可以与未排序的区间一起工作,但是当他们用在排序的区间时,算法会更加的高效。要求排序区间的算法:binary_search lower_bound upper_bound原创 2016-09-27 22:57:38 · 267 阅读 · 0 评论 -
effective stl 第33条:对包含指针的容器使用remove这一类算法时要特别小心
#include<iostream>#include<vector>#include<algorithm>using namespace std;class Widget{public: Widget(); ~Widget(); bool isCertified() const{};//该Widget是否已被验证过private:};Widget::Widget()原创 2016-09-27 10:59:38 · 367 阅读 · 0 评论 -
effective stl 第32条:如果确实需要删除元素,则需要在remove之后调用erase
remove并不是真正意义上删除,因为它做不到。remove不知道所操作的元素在哪个容器中,如果不知道,remove就不可能调用它的成员函数。#include<iostream>#include<algorithm>#include<vector>using namespace std;int main(){ //因为从容器中删除元素的方法是调用该容器的成员函数,而remove不可能从原创 2016-09-25 21:43:42 · 421 阅读 · 0 评论 -
effective stl 第31条:了解与各种排序相关的选择
有时候不需要全部排序,比如你有一个存放Widget的向量,而你希望讲质量最好的送给顾客,那么只需要排前20个最好的Widget,其他的而不用排序,partial_sort可以实现这样的功能:#include<iostream>#include<algorithm>#include<vector>using namespace std;bool qualityCompare(const int&原创 2016-09-24 18:43:53 · 357 阅读 · 0 评论 -
effective stl 第30条:确保目标区间足够大
#include<iostream>#include<string>#include<algorithm>#include<vector>using namespace std;int transmogrify(int x)//根据x的值生成新的值{ return x + 2;}int main(){ vector<int> values; for (int i原创 2016-09-24 16:33:26 · 244 阅读 · 0 评论 -
effective stl 第29条:对于逐个字符的输入考虑使用istream_iterator
//假如想将文本文件的内容复制到一个string对象中 ifstream inputFile("inputData.txt"); string fileData(istream_iterator<char>(inputFile), istream_iterator<char>()); //但是这段代码不会将空白字符复制到string对象中, istream_iterator使原创 2016-09-24 14:51:44 · 278 阅读 · 0 评论 -
effective stl 第28条:正确理解由reverse_iterator的base()成员函数所长生的iterator的用法
vector<int> v; v.reserve(5);//保留5个大小的容量 for (int i = 1; i <= 5; i++) { v.push_back(i); } vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);//找到3的位置 vector原创 2016-09-24 14:29:16 · 363 阅读 · 1 评论 -
effective stl 第27条:使用distance和advance将容器的const_iterator转换为iterator
#include<iostream>#include<iterator>#include<deque>using namespace std;int main(){ typedef deque<int> IntDeque; typedef IntDeque::iterator Iter; typedef IntDeque::const_iterator ConstIte原创 2016-09-24 13:48:01 · 656 阅读 · 0 评论 -
effective stl 第26条:iterator优于const_iterator、reverse_iterator、及const_reverse_iterator
如果喜欢使用STL,但是对istream_iterator读取字符流的性能不很满意,那么istreambuf_iterator正是需要的工具。使用iterator的3个理由: 1、有些版本的erase函数和insert函数要求使用iterator,而const和reverse的iterator不能满足这些要求。 2、想要将const_iterator隐式转换为iterator是不可能的。 3、原创 2016-09-24 13:13:33 · 1198 阅读 · 0 评论 -
effective stl 第25条:熟悉非标准的散列容器
C++标准中没有任何的散列容器,但是与STL兼容的散列容器可以从很多渠道获得,他们甚至有标准的名字:hash_set、hash_multiset、hash_map、hash_multimap,注意:其中的元素不是以散列方式存放的。hash_map和map的区别在哪里:可以参看下边的博客 http://blog.youkuaiyun.com/sdhongjun/article/details/4517325#原创 2016-09-24 10:47:12 · 391 阅读 · 0 评论 -
Effective stl 第24条:当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择
value_type()类型的参数是pair<,> key_comp()(,)可以用来等价测试#include<iostream>#include<map>using namespace std;//假设我们有一个类,它支持默认的构造函数,并根据一个double值来构造和赋值:class Widget{public: Widget(); Widget(double weig原创 2016-09-23 12:36:18 · 394 阅读 · 0 评论 -
Effective stl 第23条:考虑用排序的vector代替关联容器
如果查找速度很重要,那么考虑非标准的散列容器总是值得的,通过适当的散列函数,散列容器基本能提供常数时间的查找能力。对于许多应用,散列容器可能提供的常数时间查找能力优于set、mutiset、map、multimap的确定的对数时间的查找能力。 标准关联容器采用的结构为平衡二叉树结构。很多程序员使用数据结构分为3个顺序:建立。通过插入很多元素建立一个新的数据结构。在这个阶段,几乎所有的操作都是插入原创 2016-09-22 22:01:24 · 344 阅读 · 0 评论 -
effective stl 第22条:切勿直接修改set和multiset中的键
#include<iostream>#include<iterator>#include<set>#include<map>#include<algorithm>using namespace std;class Employee{public: Employee(); ~Employee(); const string& name() const;//获取雇员原创 2016-09-22 21:12:47 · 279 阅读 · 0 评论 -
effective stl 第21条:总是让比较函数在等值情况下返回false
#include<iostream>#include<set>#include<map>#include<algorithm>#include<functional>#include<iterator>using namespace std;int main(){ set<int, less_equal<int>> s;//s采用“<=”来排序 s.insert(10);原创 2016-09-22 20:12:28 · 674 阅读 · 0 评论 -
effective stl: 第20条,为包含指针的关联容器指定比较类型
#include<iostream>#include<string>#include<algorithm>#include<map>#include<set>using namespace std;struct stringPtrLess : public binary_function<const string*, const string*,bool>{ bool op原创 2016-09-22 19:31:51 · 280 阅读 · 0 评论 -
effective stl 第19条:理解相等(equality)和等价(equivalence)的区别
#include<iostream>#include<map>#include<set>using namespace std;bool ciStringCompare(const string l, const string r){ //该函数是对字符串不分大小写的进行比较 return true;}int main(){ /* 关联容器会自动排序,它们按照等原创 2016-09-20 23:36:17 · 748 阅读 · 0 评论 -
effective stl 第18条: 避免使用vector<bool>
vector不是容器,并且它不存储bool,因为他是按照位来存储的,即一个bool只占一个二进制位。假设有vector v;则&v[0]会引起编译错误。如果不使用&v[0]可以使用vector,否则,可以用deque 和bitset来替代原创 2016-09-10 20:10:20 · 406 阅读 · 0 评论 -
effective stl 第17条: 使用“swap 技巧”除去多余的容量
#include#include#include#includeusing namespace std;class people{public: people(); ~people();private:};people::people(){}people::~people(){}int main(){ /* 本次主要讨论的是如何消除有很大容量原创 2016-09-10 19:57:30 · 489 阅读 · 0 评论 -
effective stl 第16条: 了解如何把vector和string数据传给旧的API
#include#include#include#include#include#include#includeusing namespace std;//vector作为桥梁连接STL容器和C的APIvoid doSomething(const int* pInts, size_t numInts){}void doSomething(const char* p原创 2016-09-10 19:26:44 · 270 阅读 · 0 评论 -
effective stl 第13条:vector和string 优先于动态分配的数组
如果正在动态的分配数组,为了减轻自己的负担,请使用vector和string。只用一种情况下,用动态数组代理string是合理的。许多的string在实现背后使用了引用计数的技术,这种策略可以消除不必要的内存分配和不必要的字符拷贝,从而可以调高很多应用程序的效率。但是如果在多线程中使用了引用计数的string,你会发现,由避免分配内存和字符串拷贝所节省下来的时间比不上花在背后同步控制上的时间。原创 2016-09-10 16:13:45 · 281 阅读 · 0 评论 -
effective stl 第12条: 切勿对STL容器的线程安全性有不切实际的依赖
标准C++的世界相当狭小和古旧,没有窗口,没有网络,没有数据库,没有其他的进程。在STL容器中支持多线程的标准已经为SGI所确定,但是一个STL实现你最多只能期望:1、多个线程读是安全的。2、多个线程对不同的容器做写操作是安全的。原创 2016-09-10 16:03:50 · 440 阅读 · 0 评论