- 博客(35)
- 收藏
- 关注
原创 自我打印的C程序
main(){char* a="main(){char* a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}运行结果是打印源代码本身注:ASCII的34是"
2005-09-21 16:26:00 2129
原创 Effective STL条款50
条款50:让你自己熟悉有关STL的网站因特网充满了STL的信息。用你最喜欢的搜索引擎寻找“STL”,它一定会返回几百个链接,其中有一些可能实际上是相关的。不过,对于大多数STL程序员,没有必要搜寻。下列网站应该要提升到几乎每个人的最常使用列表的顶端: SGI STL网站,http://www.sgi.com/tech/stl/。 STLport网站,http://www.stlpo
2004-11-07 15:36:00 2580 4
原创 Effective STL 条款37
条款37:用accumulate或for_each来统计区间 有时候你需要把整个区间提炼成一个单独的数,或,更一般地,一个单独的对象。对于一般需要的信息,有特殊目的的算法来完成这个任务,比如,count告诉你区间中有多少元素,而count_if告诉你有多少元素满足一个判断式。区间中的最小和最大值可以通过min_element和max_element获得。 但有时,你需要用一些自定义的方式统
2004-03-08 11:37:00 2004
原创 Effective STL 条款35
条款35:通过mismatch或lexicographical比较实现简单的大小写无关字符串比较一个STL菜鸟最常问的问题是“我怎么使用STL来进行大小写无关的字符串比较?”这是一个令人迷惑的简单问题。大小写无关字符串比较要么真的简单要么真的困难,依赖于你要多一般地解决这个问题。如果你忽略国际化问题而且只关注于设计成字符串strcmp那样的类型,这个任务很简单。如果你要有strcmp不具有
2004-03-08 11:32:00 1723
原创 Effective STL 条款28
条款28:了解如何通过reverse_iterator的base得到iterator 调用reverse_iterator的base成员函数可以产生“对应的”iterator,但这句话有些辞不达意。举个例子,看一下这段代码,我们首先把从数字1-5放进一个vector中,然后产生一个指向3的reverse_iterator,并且通过reverse_iterator的base初始化一个iterat
2004-03-05 13:48:00 1653
原创 Effective STL 条款13
条款13:尽量使用vector和string来代替动态分配的数组 这一刻,你决定使用new来进行动态分配,你需要肩负下列职责: 你必须确保有的人以后会delete这个分配。如果后面没有delete,你的new就会产生一个资源泄漏。 你必须确保使用了delete的正确形式。对于分配一个单独的对象,必须使用“delete”。对于分配一个数组,必须使用“delete []”。如果使
2004-03-05 13:48:00 1838
原创 Effective STL 条款36
条款36:了解copy_if的正确实现 STL有很多有趣的地方,其中一个是虽然有11个名字带“copy”的算法: copy copy_backward replace_copy reverse_copy replace_copy_if unique_copy
2004-03-05 13:47:00 1818
原创 Effective STL 条款39
条款39:用纯函数做判断式我讨厌为你做这些,但我们必须从一个简短的词汇课开始: 判断式(predicate)是返回bool(或者其他可以隐式转化为bool的东西)。判断式在STL中广泛使用。标准关联容器的比较函数是判断式,判断式函数常常作为参数传递给算法,比如find_if和多种排序算法。(排序算法的概览可以在条款31找到。) 纯函数是返回值只依赖于参数的函数。如果f是一个纯
2004-03-05 13:47:00 1845
原创 Effective STL 条款40
条款40:使仿函数类可适配 假设我有一个Widget*指针的list和一个函数来决定这样的指针是否确定一个有趣的Widget: list widgetPtrs;bool isInteresting(const Widget *pw); 如果我要在list中找第一个指向有趣的Widget的指针,这很简单: list::iterator i = find_if(widg
2004-03-05 13:47:00 1758
原创 Effective STL 条款29
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator 假设我们要把一个文本文件拷贝到一个字符串对象中。似乎可以用一种很有道理的方法完成: ifstream inputFile("interestingData.txt");string fileData((istream_iterator(inputFile)), // 把inputFile读入
2004-03-05 13:47:00 1600
原创 Effective STL 条款26
条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator 正如你所知的,每个标准容器类都提供四种迭代器类型。对于container而言,iterator的作用相当于T*,而const_iterator则相当于const T*(你可能也见过T const*这样的写法:它们意思一样[1])。增加一个iterat
2004-03-05 13:47:00 1755
原创 Effective STL 条款5
条款5:尽量使用区间成员函数代替它们的单元素兄弟 快!给定两个vector,v1和v2,使v1的内容和v2的后半部分一样的最简单方式是什么?不要为“当v2有偶数个元素时才有一半”而烦恼,只要做一些合理的东西。时间到!如果你的答案是 v1.assign(v2.begin() + v2.size() /2, v2.end()); 或者其他很相似的东西,你就答对了,可以获得金质奖章。如
2004-03-05 13:47:00 1758
原创 Effective STL 条款27
条款27:用distance和advance把const_iterator转化成iterator 条款26中指出有些容器成员函数只接受iterator作为参数,而不是const_iterator。那么,如果你只有一个const_iterator,而你要在它所指向的容器位置上插入新元素呢?也就是如何把const_iterator转化为iterator呢?因为正如条款26所解释的,并不存在从c
2004-03-05 13:47:00 1610
原创 Effective STL 条款38
条款38:把仿函数类设计为用于值传递C和C++都不允许你真的把函数作为参数传递给其他函数。取而代之的是,你必须传指针给函数。比如,这里有一个标准库函数qsort的声明:void qsort(void *base, size_t nmemb, size_t size, int (*cmpfcn)(const void*, const void*));条款46解释了为什么sort
2004-03-05 13:36:00 1596
原创 Effective STL 条款34
条款34:注意哪个算法需要有序区间 不是所有算法可以用于任意区间。比如,remove(参见条款32和33)需要前向迭代器和可以通过这些迭代器赋值的能力。所以,它不能应用于由输入迭代器划分的区间,也不能是map或multimap,也不能是set和multiset的一些实现(参见条款22)。同样,很多排序算法(参见条款31)需要随机访问迭代器,所以不可能在一个list的元素上调用这些算法。如果
2004-01-21 13:28:00 1635
原创 Effective STL 条款33
条款33:提防在指针的容器上使用类似remove的算法 你在管理一堆动态分配的Widgets,每一个都可能通过检验,你把结果指针保存在一个vector中: class Widget{public: ... bool isCertified() const; // 这个Widget是否通过检验 ...};vector v; // 建立一个vector然后用
2004-01-21 13:27:00 1411
原创 Effective STL 条款32
条款32:如果你真的想删除东西的话就在类似remove的算法后接上erase 我将从remove的复习开始这个条款,因为remove是STL中最糊涂的算法。误解remove很容易,驱散所有关于remove行为的疑虑——为什么它这么做,它是怎么做的——是很重要的。 这是remove的声明: templateForwardIterator remove(ForwardIterato
2004-01-21 13:26:00 1542
原创 Effective STL 条款30
条款30:确保目标区间足够大STL容器在被添加时(通过insert、push_front、push_back等)自动扩展它们自己来容纳新对象。这工作的很好,有些程序员因为这个信仰而被麻痹,认为他们不必担心要为容器中的对象腾出空间,因为容器自己可以照顾好这些。如果是那样就好了!当程序员想向容器中插入对象但并没有告诉STL他们所想的时,问题出现了。这是一个常见的可以自我表现的方法:int
2004-01-21 13:24:00 1622
原创 Effective STL 条款31
条款31:了解你的排序选择 How can I sort thee? Let me count the ways. 当很多程序员想到排序对象时,只有一个算法出现在脑海:sort。(有些程序员想到qsort,但一旦他们看了条款46,他们会放弃qsort的想法并用sort的想法取代之。) 现在,sort是一个令人称赞的算法,但如果你不需要你就没有必要浪费表情。有时候你不需要完全排序。比如,
2004-01-21 13:24:00 1440
原创 Effective STL 条款23
条款23:考虑用已序vector代替关联容器 当需要一个提供快速查找的数据结构时,很多STL程序员立刻会想到标准关联容器:set、multiset、map和multimap。直到现在这很好,但不是永远都好。如果查找速度真得很重要,的确也值得考虑使用非标准的hash容器(参见条款25)。如果使用了合适的hash函数,则可以认为hash容器提供了常数时间的查找。(如果选择了不好的hash函数或表的
2003-12-23 13:57:00 1403
原创 Effective STL 条款48
条款48:总是#include适当的头文件STL编程的次要麻烦之一是虽然可以很容易地建立可以在一个平台上编译的软件,但在其它平台上则需要附加的#include指示。这个烦恼来自一个事实:C++标准(不像C标准)未能指定哪一个标准头文件必须或者可能被其他标准头文件#include。由于有了这样的灵活性,不同的实现就会选择去做不同的东西。 这在实践中意味着什么?我可以给你一些的概念。我使用了五
2003-12-23 13:51:00 1232
原创 Effective STL 条款4
条款4:用empty()来代替检查size()是否为0 对于任意容器c,写下 if (c.size() == 0)... 本质上等价于写下 if (c.empty())... 这就是例子。你可能会奇怪为什么一个构造会比另一个好,特别是事实上empty()的典型实现是一个返回size()是否返回0的内联函数。 你应该首选empty()的构造,而且理由很简单:对于所有的标准容器
2003-12-23 13:50:00 1389
原创 Effective STL 条款3
条款3:使容器里对象的拷贝操作轻量而正确 容器容纳了对象,但不是你给它们的那个对象。此外,当你从容器中获取一个对象时,你所得到的对象不是容器里的那个对象。取而代之的是,当你向容器中添加一个对象(比如通过insert或push_back等),进入容器的是你指定的对象的拷贝。当你从容器中获取一个对象时(比如通过front或back),你取到的是容器中那个对象的拷贝。拷进去,拷出来。这就是STL的方
2003-12-23 13:48:00 1548
原创 Effective STL 条款1:仔细选择你的容器
条款1:仔细选择你的容器 你知道C++中有很多你可以支配的容器,但是你意识到有多少吗?要确定你没有忽略你的选项,这里有一个快速回顾。 标准STL序列容器:vector、string、deque和list。 标准STL关联容器:set、multiset、map和multimap。 非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串
2003-12-23 13:46:00 2117
原创 Cg In Two Pages
Cg in Two PagesMark J.KilgardNVIDIA CorporationAustin, TexasJanuary 16, 2003游戏引擎开发网 龚敏敏 翻译1. Cg用例Cg是用于GPU编程的语言。Cg程序看起来非常像C程序。这儿有一个Cg顶点程序:void simpleTransform(float4 objectPosition :
2003-07-17 07:49:00 1752
原创 Cg FAQ
Cg FAQCg语言 Cg是什么? C for Graphics。Cg是对GPU编程的高级语言,由NVIDIA在Microsoft的密切协作下开发。 是谁在维护Cg语言规范? NVIDIA在维护Cg语言规范,而且会继续和Microsoft合作维护它和DirectX High Level Shading Language (HLSL)之间的
2003-06-26 10:15:00 1929
原创 FOURCC的生成
FOURCC的生成什么是FOURCCFOURCC全称Four-Character Codes,是在编程中非常常用的东西,一般用作标示符。比如wav、avi等RIFF文件的标签头标示,Quake 3的模型文件.md3中也大量存在等于“IDP3”的FOURCC。它是一个32位的标示符,其实就是typedef unsigned long FOURCC用宏生成FOURCCFOURCC是由四
2003-06-26 10:12:00 2051
原创 Effective STL 条款45
STL搜索算法的区别[1]你要寻找什么,而且你有一个容器或者你有一个由迭代器划分出来的区间——你要找的东西就在里面。你要怎么完成搜索呢?你箭袋中的箭有这些:count、count_if、find、find_if、binary_search、lower_bound、upper_bound和equal_range。面对着它们,你要怎么做出选择?简单。你能很快很容易地做到。能更快,更容易,更好。
2003-06-26 10:12:00 5591
原创 Effective STL条款21
条款21: 永远让比较函数对相等的值返回false让我向你展示一些比较酷的东西。建立一个set,比较类型用less_equal,然后插入一个10:set > s; // s以“<=”排序s.insert(10); // 插入10现在尝试再插入一次10:s.insert(10);对于这个insert的调用,set必须先要判断出10是否已经位于其中了。 我们知道它是
2003-06-26 10:11:00 1153
原创 Effective STL条款44
条款44: 尽量用成员函数代替同名的算法有些容器拥有和STL算法同名的成员函数。关联容器提供了count、find、lower_bound、upper_bound和equal_range,而list提供了remove、remove_if、unique、sort、merge和reverse。大多数情况下,你应该用成员函数代替算法。这样做有两个理由。首先,成员函数更快。其次,比起算法来,它们与容器
2003-06-26 10:11:00 1288
原创 Effective STL 目录
由于没有看内容,有些翻译可能不准确,请见谅:)容器条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: 尽量使用范围成员函数代替他们的单元素兄弟 条款6: 警惕C++的及其令人恼怒的分析 条款7: 当使用new得指针的容器时,切记在容器销毁前d
2003-06-26 10:11:00 1382
原创 Effective STL前言
It came without ribbons!It came without tags! It came without packages, boxes or bags!——Dr. Seuss, How the Grinch Stole Christmas!, Random House, 1957我第一次写关于Standard Template Library的东西是在1995年,那时,我决
2003-06-26 10:10:00 1084
原创 Effective STL条款16
条款16: 如何将vector和string的数据传给传统的API因为 C++语言已经于1998年被标准化,C++的中坚分子在努力推动程序员从数组转到vector时就没什么顾虑了。同样显然的情况也发生于尝试使开发者从char*指针迁移到string对象的过程中。有很好的理由来做这些转变,包括可以消除常见的编程错误(参见条款13),而且有机会获得STL算法的全部强大能力(比如参见条款31)。
2003-06-26 10:10:00 1155
原创 Effective STL 条款2
条款 2: 小心对“容器无关代码”的幻想STL是建立在泛型之上的。数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。这只是个开始。独立的容器类型泛化为序列或关联容器,而且类似的容器拥有类似的功能。标准的内存相邻容器(参见条款1)都提供随机访问迭代器,标准的基于节点的容器(再参见条款1)都提供双向迭代器。序列
2003-06-26 10:08:00 1511
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人