??xml version="1.0" encoding="utf-8" standalone="yes"?>伊人久久综合精品无码AV专区,国产精品亚洲综合久久,国产亚洲综合久久系列http://www.shnenglu.com/Daywei0123/category/20847.html技术追求卓?梦想创造未?/description>zh-cnSun, 11 Sep 2016 16:29:58 GMTSun, 11 Sep 2016 16:29:58 GMT60SDL认识http://www.shnenglu.com/Daywei0123/archive/2016/06/28/213813.htmlDayweiDayweiMon, 27 Jun 2016 16:17:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2016/06/28/213813.htmlhttp://www.shnenglu.com/Daywei0123/comments/213813.htmlhttp://www.shnenglu.com/Daywei0123/archive/2016/06/28/213813.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/213813.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/213813.html
然后说说从个度上看SDL的特炏V?br />
1.跨^台?/strong>确实实是跨了N个^収ͼ甚至包括NDSq种q_。有了SDLQ你甚至可以在windows、linux、Android上Q意移植你的游戏。当Ӟ前提是你目标q_的编译器认识你的代码(K?#9661;K?”。有了SDL泥甚臛_以只用c语言开发安卓游戏哟?br />
2.开源?/strong>

3.SDL2.0l图效率很高。事实上相较之SDL1.2我个人比较喜ƢSDL2.0的原因也是在此。个人感觉(其实我没看过源码QSDL1.2应该是个跟当q的DirectDraw差不多的东西Q像素填充什么的Q有相当E度上是要磨CPU的。而SDL2.0从绘图方式上革CQ抛弃了之前的surface与clip的模式,把实际绘制的东西改ؓ了TextureQ而把之前的surface改ؓ了创建Texture的一个时环节。而texureQ顾名思义Q其实就是DirectX、OpenGLq些底层?Dg加速API的脓图?br />
当下DirectX、OpenGL标准下的昑֍的渲染管U无非就是:1.把顶点(可以理解成坐标)传给昑֍ ?.把texture传给昑֍?3.告诉昑֍怎么处理q些数据QshaderQ?4.昑֍把东西给你显C出来。而基于DirectX、OpenGL(Udq_是OpenGL ES)的SDL2.0Q正是恰好地利用了当下显卡的能力?br />
4.SDL可以用作3D囑փ引擎和底层DirectX/OpenGL API的中间层。当Ӟ其实如果把SDLq样用的话,那就真是很薄的一层了Q)

5.易用。这是相对而言的,比如在windows上,你用了SDLq个库之后,基本׃用去理会Windows那些又臭又长用不着的参数又多的API了。我不是在讨Z仰问题也不是要诋毁windowsQ我是在客观陈述windows api那个要初始化一个窗口必要?00行代码的讑֮实在是打d学者积极性的事实?br />
SDL_image、SDL_ttf、SDL_mixer、SDL_net 外部扩展库,也是不错的选择?/span>

性能没有试Q仅从写代码角度上来_个h感觉2.0操作给弄得复杂了?br />
1.2---------------------------------------
只有SDL_Surface的概念,屏幕是surfaceQ图片,文字{都是surfaceQ?br />只要准备好的各U图片,贴到屏幕里去(SDL_BlitSurface)Q再刷一下屏q?SDL_Flip全局的、或SDL_UpdateRect局部的)ok了。。?br />
SDL_Init(SDL_INIT_EVERYTHING);

SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
SDL_Surface* bmp = SDL_LoadBMP("back.bmp");
SDL_BlitSurface(bmp, 0, screen, 0);
SDL_Flip(screen);

while(SDL_WaitEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
return;
}
}
SDL_Quit();
2.0---------------------------------------
整出了SDL_Window,SDL_Renderer,SDL_Texture新的3个东ѝ?br />q且我要M张图Q先要得到surfaceQ然后{换ؓtextureQ再临时贴到rendererQ最后才刷屏?br />
SDL_Init(SDL_INIT_EVERYTHING);

SDL_Window* window = SDL_CreateWindow("hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_Surface* surface = SDL_LoadBMP("back.bmp");
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, 0, 0);
SDL_RenderPresent(renderer);

while(SDL_WaitEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
return;
}
}
SDL_Quit();

其实Q我真心不觉得提出SDL_Window,SDL_Renderer,SDL_Textureq些概念先进性在哪里Q可能是与openGL的概念保持一致吧?br />而且从维护的角度出发Q不sdl2.0性能提升了多,如果接口本n不需要改动,不是更加好么Q?br />
---------------------------------------------
最后我发现Q同h渲染的窗?br />1.2用SDL_Flip(screen);之后被其他窗口挡住之后,回来画面q是在的Q?br />2.0用SDL_RenderPresent(renderer);之后被其他窗口挡住之后,回来画面׃在了Q?

Daywei 2016-06-28 00:17 发表评论
]]>
Exceptional C++ MW记2http://www.shnenglu.com/Daywei0123/archive/2014/08/22/208095.htmlDayweiDayweiFri, 22 Aug 2014 07:00:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208095.htmlhttp://www.shnenglu.com/Daywei0123/comments/208095.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208095.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/208095.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/208095.html
如果只需要流的前|声明,应该优先使用#include<iosfwd>

只需要前|声明时Q绝不要?include包含相应的头文g?br />
如果使用聚合关系已l够,׃要用ѝ?br />
要避免用内联或者复杂的调整ҎQ除非通过性能分析证明q确实是必要的?br />
正确使用名字I间。如果将一个类攑օ名字I间Q那么同时要保证这个类的所有辅助函数和q算W函C攑օ相同的名字空间。否则,你将在代码中发现奇怪的l果?img border="0" alt="" src="http://www.shnenglu.com/images/cppblog_com/daywei0123/内存区域.jpg" width="1708" longdesc="" height="2000" />
要理解这五种不同cd的内存,了解他们Z么是不同的,以及他们各自的行为又是怎么P栈(自动变量Q、自由存储(new/deleteQ、堆Qmalloc/freeQ、全局Q静态变量、全局变量、文件作用域变量{)、常量数据(字符串常量等Q?br />
优先使用自由存储Qnew/deleteQ,避免使用堆(malloc/freeQ?br />
对于“?#8221;?#8220;自由存储”q行区分Q这一点很重要Q因为在C++标准中有意避开了这两种cd的内存是不是相关的这个问题。例如,当通过Q:operator delete()函数来释攑ֆ存时Q在C++标准?8.4.1.1中,最后一Ҏq样的:
“ 在C++标准中ƈ没有规定Q在哪些情况下,在通过operator delete回收的存储空间中Q有一部分或者全部的控g可以再随后调用operator new或者callocQmalloc以及realloc{函数时被重新分配,q些函数的声明时?lt;cstdlib>中?#8221;
而且Q在C++标准中也没有规定Qnew/delete是否需要通过malloc/free来实现。不q,在C++标准20.4.6节的W?D和W?D中规定了,malloc/free一定不能用new/delete来实玎ͼ“calloc、malloc和realloc函数不会通过调用::operator new()来分配存储空间。函数freeQ)不会通过调用::operator delete() 来释攑ֆ存?#8221;

如果在类中定义了new和delete中的L一个运符函数Q那么一定要同时定义另外一个?br />
通常应该昑ּ地将函数operator new ()和operator delete()声明为静态函数。他们永q都不能佉K静态成员函数?br />
永远都不要通过多态的方式处理数组?br />
优先选择使用vector或者dequeQ而不是数l?br />
在编写拷贝赋D符函数Ӟ永远都不要指望能够通过对自我赋D行检来保证函数的正性;应该在拷贝赋D符函数中?#8220;创徏临时对象q进行交?#8221;的惯用法Q这U方法不仅是异常安全的,而且在处理自我赋值时也是安全的?br />
可以自我赋值检作ZU优化手D,以避免不必要的工作,q是正确地做法?br />
不仅要避免编写类型{换运符函数Q而且q要避免~写隐式的构造函数?br />
量~写异常安全的代码。在~写代码时应该始l遵循:即在出现异常时Q资源仍然能够被正确地释放,q且数据也L处于一致的状态?br />
避免使用语言中那些不常用的特性,而应该用最单ƈ且有效的技术?br />
拯初始化过E绝不是赋DE,因此在初始化中永q都不会调用函数T::operator=()。是的,我知道在初始化语句中有一?#8220;=”W合Q但不要被它qh。它只是从C语言中沿用过来的一U语法,q不代表赋D?br />
如果可能的话Q优先?#8220;T t(u);”q种形式Q而不?#8220;T t=u;”的Ş式。通常Q能能够时候后者的地方Q都可以使用前者,q且使用前者还有更多的好处——例如Q可以带多个参数?br />
在函数声明中Q如果参数是以传值方式来传递的Q则不要使用const。而如果在q个函数的定义中Q参数是不能被修改的Q那么应该用const?br />
对于不是内置cd的返回值来_当用返回值的方式而不是返回引用的方式Ӟ应该优先选择q回const倹{?br />
const 和mutable都是你的朋友

优先使用新Ş式的cd转换?br />
不要通过cd转换L帔R属性,而应该用mutable?br />
避免使用向下的类型{换?br />
优先通过引用方式来传递对象参敎ͼ而不是传值方式,q且在所有可能的地方都用const?br />
避免使用内联Q除非从性能的分析上来看实有必要这么做?br />
避免使用全局变量或者静态变量。如果必M用,那么一定要特别注意q些变量的初始化序?br />
在构造函数的初始化列表中Q应该把 基类按照他们在类定义中出现的先后序q行排列?br />
在编写代码时Q永q都不应该依赖函数参数的求值顺?img src ="http://www.shnenglu.com/Daywei0123/aggbug/208095.html" width = "1" height = "1" />

Daywei 2014-08-22 15:00 发表评论
]]>
Exceptional C++ MW记1http://www.shnenglu.com/Daywei0123/archive/2014/08/22/208093.htmlDayweiDayweiFri, 22 Aug 2014 03:50:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208093.htmlhttp://www.shnenglu.com/Daywei0123/comments/208093.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208093.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/208093.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/208093.htmll对不要Ҏ效的q代器执行解引用QdereferenceQ操?br />
用于不要异常安全性放在事后考虑。异常安全性会影响到类的设计。它永远都不?#8220;只是一个实现细?#8221;?br />
在传递对象参数时Q选择const&方式而不是传值方式?br />
对于E序q行中不会改变的|应该预先计算q保存v来备用,而不是重复地创徏对象Q这是没有必要的?br />
通常Qؓ了保持一致性,应该使用前置递增来实现后|递增Q否则,当其他用户在使用你的cLQ可能会得到奇怪结果?br />
优先选择使用前置递增。只有在需要初始值时Q才使用后置递增?br />
在进行隐式类型{换时Q要注意在{换过E中创徏?临时对象。要避免q个问题Q一个好办法是可能地通过昑ּ的方式来构造对象,q免编写类型{换运符?br />
C对象的生存期。永q,永远Q永q都不要q回指向局部对象的指针或引用;它们没有M用处Q因Z调代码无法跟t它们的有效性,但却可能会试图这么做?br />
可能地重用代码——其是标准库中的代码——而不是自己去~写代码Q这h快、更ҎQ也更安全?br />
如果在函C不打处理所抛出的异常,那么应该异常{发给能够q行处理的上层调用者?br />
在编写代码时应该始终遵@Q即使在出现异常Ӟ资源仍然能够被正地释放Qƈ且数据也L处于一致的状态?br />
遵@标准的异常安全规则:永远不要在析构函数、重载运符函数operator delete()或者operator delete[]()中抛出异常; 在编写每个析构函数和内存释放函数Ӟ要假讑֭在着“throw()”q样的异常规范?br />
遵@标准的异常安全性规则:在每个函CQ要所有可能会抛出异常的代码单独放在一Pq且对这些代码进行安全处理。然后,当你认q些代码执行的工作都已经成功地完成时Q才可以使用不会抛出异常的操作来修改E序的状态?br />
永远都不要到最后才实现异常安全性。异常安全性会对类的设计生媄响。它永远都不?#8220;只是一个实现细?#8221;?br />
优先考虑实现内聚。要努力使每D代?#8212;—每个模块、每个类、每个函?#8212;—都只有单一的,q且是明定义的功能?br />
“异常不安?#8221;L?#8220;拙劣的设?#8221;l伴的。如果程序的设计逻辑清晰Q那么即使有一D代码不是异常安全的Q一般来说也不会有太大问题,q且可以很简单地q行修正。但如果有一D代码由于设计问题而不能被~写成异常安全的Q我们通常都会认ؓq个设计时拙劣的。下面是两个拙劣设计的示例?br />CZ1Q如果在一个函C需要实C个不同的功能Q那么这个函数很难被~写成异常安全的?br />CZ2Q如果在拯赋D符函数中必d自我赋D行检,那么q个函数也可能不是完全异常安全的

遵@标准的异常安全性规则:?#8220;获得资源也就意味着初始?#8221;q种模式来分资源的所有权和资源的理权?br />
在进行设计中Q要始终牢记重用性?br />
优先采用“ a op=b;”q种写法Q而不?a = a op b;"Q这里的op表示某个q算W)。这U写法更为清晎ͼ效率也高?br />
如果定义了某个运符Q例如,operator+Q,那么通常q应该同时定义与q个q算W相对应的赋D符Q例如,operator+=Q。ƈ且用后者来实现前者。而且Q还应该l护op和op=之间的自然关pR?br />
在C++标准中规定:q算W?Q(Q,[]?>必须被定义ؓ成员函数Q而在cM定义的new,new [],delete和delete[]{运符函数必须是静态成员函数。对于其他的q算W函敎ͼ
     如果q算W函数是用于I/O的opeator>>或者operator<<Q或者如果运符函数需要对其左操作数进行类型{换,或者运符函数可以通过cȝ公有接口来实玎ͼ那么这个函数定义ؓ非成员函敎ͼ在前两种情况中,如果需要的话也可以被定义ؓ友元函数Q;如果q算W函数需要实现虚函数的行为,那么增加一个虚函数来提供虚函数的行为,q用q个虚成员函数来实现q算W函数否则将预算富函数定义ؓ成员函数?br />
在函数opeator>>和operator<<中应该始l返回对对象的引用?br />
基cȝ析构函数定义函数Q除非你能保证,永远都不会有人通过指向基类的指针来删除zcȝ对象Q?br />
如果在派生类中定义的函数与基cM的函数有相同的名字,q且你不想隐藏基cM函数Q那么应通过using声明语句基cȝq个函数引入到派生类的作用域中?br />
永远不要改变被覆盖的基类函数中的默认参数倹{?br />
除了对真正的Liskov IS-A和WORKS-LIKE-A关系q行建模之外Q永q都不要使用共有l承。所有被覆盖的成员函C能超q实际需求的范围Q同时也不能于q个范围?br />
使用公有l承的目的是重用代码Q编写以多态的方式使用基类对象的代码)Q而重用(基类中的Q代码ƈ不一定要使用公有l承?br />
?#8220;is implemented in terms of”q种关系建模Ӟ应该优先选择成员关系/包含的方式,而不是私有承的方式。只有非用承不可时Q才应该使用U有l承——也就是说Q当需要访问保护成员或者需要覆盖虚函数Ӟ才用私有ѝ永q都不要只是Z代码重用而用共有ѝ?br />
对于q泛使用的类Q应该优先用编译器防火墙这U惯用法Q也叫做Pimpl惯用法)来隐藏实现细节,通过一个不透明的指针(指向一个进行了前置声明但又没有定义的类Q来保存U有成员Q包括状态变量和成员函数Q,声明q个指针时可采用“struct XxxxImpl* pImpl;XxxxImpl* pimpl_;”q样的Ş式。例如:“class map{ private :struct MapImpl;MapImpl* pimpl_;}”

包含Q也可以叫做“聚合”Q?#8220;分层”Q?#8220;HAS-A”或?#8220;委托”。优先选择包含而不是承,对于IS-IMPLEMENTED-IN-TERMS-OFq种关系建模Ӟ应该优先考虑使用包含Q而不是ѝ?br />



Daywei 2014-08-22 11:50 发表评论
]]>
从缺陷中学习C/C++http://www.shnenglu.com/Daywei0123/archive/2014/07/24/207780.htmlDayweiDayweiThu, 24 Jul 2014 07:29:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/07/24/207780.htmlhttp://www.shnenglu.com/Daywei0123/comments/207780.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/07/24/207780.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/207780.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/207780.html有符号int与无W号int比较的后?/strong>
int i = -1;
unsigned 
int ud=1;
if(i < ud)
{
    printf(
"true");
}

else
{
    printf(
"false");
}
一看结果应该是打印出trueQ但事实却是false?br />signed int 型变量被转换成unsigned int型变量?1转换成unsigned int的结果是一个非常巨大的正整敎ͼ32位系l上??2ơ方-1Q,需要进行强转ؓint型?br />
位域变量
struct data
{
int flag:1;
int other:31;
}
;
printf(
"data size %d\n",sizeof(data));
data test1;
test.flag
= 1;
if(test.flag ==1)
{
printf(
"true");
}

else
{
printf(
"false");
}
int的位域变量,而用一个bit表示intӞq一位是用来表示有符号位的,带符L一个bit的位域变量的取D围是0?1.无符L一个bit的位域变量的取D围是0?Q故1赋给flag时会出现溢出Qflag变ؓ-1.
ReferenceQ?a >http://wenku.baidu.com/view/670eff4bf7ec4afe04a1dfd7.html

Daywei 2014-07-24 15:29 发表评论
]]>
Effective STL(5)——算?/title><link>http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Wed, 25 Jun 2014 09:06:00 GMT</pubDate><guid>http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html</guid><wfw:comment>http://www.shnenglu.com/Daywei0123/comments/207410.html</wfw:comment><comments>http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Daywei0123/comments/commentRss/207410.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Daywei0123/services/trackbacks/207410.html</trackback:ping><description><![CDATA[<div><span style="font-size: 18pt">1.保目标I间_?br /></span><br /><span style="font-size: 18pt">2.了解各种与排序有关的选择</span><br /><span style="font-size: 18pt">  </span><span style="font-size: 14pt">如果需要对vector、string、deque或者数l中的元素执行一ơ完全排序,那么可以使用sort或者stable_sort?/span><br /><span style="font-size: 14pt">  如果有一个vector、string、deque或者数l,q且只需要对{h性最前面的n个元素进行排序,那么可以使用partial_sort?/span><br /><span style="font-size: 14pt">  如果有一个vector、string、deque或者数l,q且需要找到第n个位|上的元素,或者,需要找到等h最前面的n个元素但又不必对qn个元素进行排序,那么Qnth_element正是你所需要的函数?/span><br /><span style="font-size: 14pt">  如果需要将一个标准序列容器中的元素按照是否满x个特定的条g区分开来,那么Qpartition和stable_partition可能正是你所需要的?/span><br /><span style="font-size: 14pt">  如果你的数据在一个list中,那么你仍然可以直接调用partition和stable_partition法Q可以用list::sort来替代sort和stable_sort法。但是,如果你需要获得partial_sort或nth_element法的效果,那么Q正如前面我所提到的那P你可以有一些简z的途径来完成这Q务?br /></span><br /><span style="font-size: 18pt">3。如果确实需要删除元素,则需要在removeq一cȝ法之后调用erase?br /></span><br /><span style="font-size: 18pt">   </span><span style="font-size: 14pt">remove不是真正意义上的删除Q因为它做不到?br /></span><br /><span style="font-size: 18pt">4.对包含指针的容器使用removeq一cȝ法时要特别小心。会D资源泄露?br /></span><br /><span style="font-size: 18pt">5.了解哪些法要求使用排序的区间作为参数?br /></span><br /><span style="font-size: 18pt">6.通过mismatch或lexicographical_compare实现单地忽略大小写的字符串比?br /></span><br /><span style="font-size: 18pt">7.理解copy_if法的正实?br /></span><br /><span style="font-size: 18pt">8.使用accumlate或者for_eachq行区间l计?/span></div><img src ="http://www.shnenglu.com/Daywei0123/aggbug/207410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Daywei0123/" target="_blank">Daywei</a> 2014-06-25 17:06 <a href="http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Effective STL(4)——P代器http://www.shnenglu.com/Daywei0123/archive/2014/06/13/207272.htmlDayweiDayweiFri, 13 Jun 2014 07:00:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/06/13/207272.htmlhttp://www.shnenglu.com/Daywei0123/comments/207272.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/06/13/207272.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/207272.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/207272.html1.iterator 优先于const_iterator、reverse_iterator及const_reverse_iterator

2.使用distance和advace容器的const_iterator转换成iterator

3.正确理解由reverse_iterator的baseQ)成员函数所产生的iterator的用法?br />
4.对于逐个字符的输入请考虑使用istreambuf_iterator


Daywei 2014-06-13 15:00 发表评论
]]>
Effective STL(3)——关联容?/title><link>http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Fri, 16 May 2014 08:30:00 GMT</pubDate><guid>http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html</guid><wfw:comment>http://www.shnenglu.com/Daywei0123/comments/206995.html</wfw:comment><comments>http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Daywei0123/comments/commentRss/206995.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Daywei0123/services/trackbacks/206995.html</trackback:ping><description><![CDATA[<div><span style="font-size: 18pt">1.理解相等QequalityQ和{hQequivalenceQ的区别<br /></span><br /><span style="font-size: 14pt">相等的概忉|Zoperator==的。等价关pL?#8220;在已排序的区间中对象值得相对序”为基的。如果从每个标准兌容器的排列顺序来考虑{h关系Q那么着是有意义的。标准关联容器室Z{h而不是相{的?/span><span style="font-size: 14pt">标准兌容器L保持排列序的,所以每个容器必L一个比较函敎ͼ默认lessQ来军_保持怎样的顺序。等h按照</span><u style="font-size: 14pt"><strong>比较函数子?/strong></u><span style="font-size: 14pt">因此Q标准关联容器的使用者要为所使用的每个容器指定一个比较函敎ͼ用来军_如何排序Q。如果该兌容器使用相等来决定两个对象是否有相同的|那么每个兌容器除了用于排序的比较函数外Q还需要另一个比较函数来军_两个值是否相{(默认情况下,该比较函数应该是equal_toQ但有趣的是equal_to从来没有被用做STL的默认比较函数。当STL中需要相{判断时Q一般的惯例是直接调用operator==。比如,非成员函数find法是q么做的Q?br /></span><br /><span style="font-size: 18pt">2.为包含指针的兌容器指定比较cd<br /></span><br /><span style="font-size: 14pt">whyQ第一条已l说明关联容器是要排序。每当你要创建包含指针的兌容器Ӟ一定要CQ容器将会按照指针的D行排序。一般是不是你希望的Q所以你几乎要创q函数子类作ؓ该容器的比较cd?br /></span><br /><span style="font-size: 18pt">3.L让比较函数在{值情况下q回false<br /></span><br /><span style="font-size: 14pt">比较函数的返回D明的是按照该函数定义的排列顺序,一个值是否在另一个之前。相{的g来不会有前后序关系Q所以,对于相等的|比较函数应该始终q回false?br /></span><br /><span style="font-size: 18pt">4.切勿直接修改set或multiset中的键?br /></span><br /><span style="font-size: 18pt">5。考虑用排序的vector替代兌容器<br /><br /></span><span style="font-size: 14pt">在排序的vector中存储数据可能比在标准关联容器中存储同样的数据要耗费更少的内存,而考虑到页面错误的因素Q通过二分搜烦法来查找一个排序的vector可能比查找一个标准关联容器要更快一些?/span><span style="font-size: 18pt"><br /></span><br /><span style="font-size: 18pt">6.当效率至关重要时Q请在map::operator[]与map::insert之间谨慎做出选择<br /></span><br /><span style="font-size: 14pt">map::operator[]的设计目的是Z提供“d和更?#8221;的功能。添加一个新元素最好选后者insert?br /></span><br /><span style="font-size: 18pt">7.熟悉非标准的散列容器?/span></div><img src ="http://www.shnenglu.com/Daywei0123/aggbug/206995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Daywei0123/" target="_blank">Daywei</a> 2014-05-16 16:30 <a href="http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Effective STL (2)——vector ?stringhttp://www.shnenglu.com/Daywei0123/archive/2014/04/20/206655.htmlDayweiDayweiSun, 20 Apr 2014 06:10:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/04/20/206655.htmlhttp://www.shnenglu.com/Daywei0123/comments/206655.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/04/20/206655.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/206655.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/206655.html1.vector和string优先于动态分配的数组?br />
2.使用reserve来避免不必要的重新分?/span>
    关于stl容器会自动增长以便容U下你放入其中的数据Q只要没有超q它们的最大限制就可以。对于vector和stringQ增长过E是q样实现的:每当需要更多空间时Q就调用与realloccM的操作。这一cM于relloc的操作分为如?部分Q?/span>
        Q?Q分配一块大ؓ当前定w的某个倍数的新内存。在大多数实CQvector和string的容量每ơ以2的倍数增长Q即每当容器需要扩张时Q它们的定w卛_倍?/span>
         Q?Q把容器的所有元素从旧的内存复制到新的内存中?/span>
         Q?Q析构掉旧内存中的元?/span>
         Q?Q释放旧内存
    reserve成员函数能你把重新分配的次数减到最低限度,从而避免了重新分配和指针P代器引用失效带来的开销?/span>
    单概括一下四个相互关联、但有时会被h的成员函数。在标准容器中,只有vector和string提供了所有这四个函数Q?/span>
         Q?QsizeQ) 告诉你容器中有多个元素Q它不会告诉你该容器己所包含的元素分配了多少内存?/span>
         Q?QcapacityQ)告诉你容器利用已l分配的内存可以容纳多少元素。这是容器所能容U的元素LQ而不是它q能容纳多少个元素。如果你想知道一个vector有多未被用的内存Q就得从capacityQ)中减去sizeQ)。如果size和capacityq回同样的|p明容器中不再有剩余空间了Q因此下一个插入操作(push_backQ将D上面所提到的重新分配过E?/span>
         Q?QresizeQxxQ强q容器改变到包含n个元素的状态。在调用resize之后Qsize返回n。如果n比当前的大小QsizeQ要,则容器尾部的元素会被析构掉。如果n比当前的大小要大Q则通过默认构造函数创建的新元素将被添加到容器的末。如果n比当前的定w要大Q那么在d元素之前Q将先重新分配内存?/span>
          Q?QreserveQxxQ强q容器把它的定w变ؓ臛_是nQ前提是n不小于当前的大小。这通常会导致重新分配,因ؓ定w需要增加。(如果n比当前的定w,则vector什么也不做Q?/span>
       因此Q避免重新分配的关键在于Q尽早的只用reserveQ把容器的容量设够大的|最好是在容器刚被构造出来之后就使用reserve?/span>

3.注意string实现的多h?/span>
   
4.了解如何把vector和string数据传给旧的API

5.使用“swap技?#8221;除去多余的容量?/span>

6.避免使用vector<bool>
    vector<bool>不是一个stl容器Q也不存储bool。在一个典型的实现中,储存在vector中的每个bool仅占一个二q制位,一?位的字节可容U?g?#8220;bool”。在内部vector<bool>使用了与位域一L思想Q来表示它所存储的那些boolQ实际上只是假装存储了这些bool?/span>
     vector<bool>不完全满STL容器的要求;你最好不要用它Q你可以使用deque<bool>和bitset来替代它Q这两个数据l构几乎能做vector<bool>所能做的一切事情?/span>

Daywei 2014-04-20 14:10 发表评论
]]>
Effective STL Q?Q?/title><link>http://www.shnenglu.com/Daywei0123/archive/2014/04/04/206473.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Fri, 04 Apr 2014 13:10:00 GMT</pubDate><guid>http://www.shnenglu.com/Daywei0123/archive/2014/04/04/206473.html</guid><wfw:comment>http://www.shnenglu.com/Daywei0123/comments/206473.html</wfw:comment><comments>http://www.shnenglu.com/Daywei0123/archive/2014/04/04/206473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Daywei0123/comments/commentRss/206473.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Daywei0123/services/trackbacks/206473.html</trackback:ping><description><![CDATA[<p><span style="font-size: 14pt"><strong> 慎重选择容器cd </strong></span><br /> 标准序列容器Qvector string deque list<br /> 标准兌容器 : set multiset map multimap<br /> 非标准序列容? slist rope. slist 是一个单向链表,rope 本质上市一?#8220;重型”string<br /> 非标准的兌容器 hash_set hash_nultiset hash_map hash_multimap vector<char> 作ؓstring的替代?vector 作ؓ标准兌容器的替?<br /> 几种标准的非STL容器 包括 数组、bitset valarray stack queue ?priority_queue<br /><br /><strong><u> 容器可分cMؓ q箋内存容器和基于节点的容器<br /></u></strong><br />q箋内存容器把它的元素存攑֜一块或多块Q动态分配的Q内存中Q每块内存中存有多个元素。当有新元素插入或已有的元素被删除时Q同一内存块中的其他元素要向前或向后移动,以便为新元素让出I间Q或者填充被删除元素所留下的空隙?<br />Z节点的容器在每一个(动态分配的Q内存块中只存放一个元素。容器中元素的插入或删除只媄响到指向节点的指针,而不影响节点本n的内容,所以当有插入或删除操作Ӟ元素的g需要移动?br /><br />你是否需要在容器的Q意位|插入新元素Q如果需要,选择序列容器Q关联容器是不行的?br />你是否关心容器中的元素师排序的?如果不关心,则哈希容器室一个可行的选择ҎQ否则,你要避免哈希容器?br />容器中数据的布局是否需要和C兼容Q如果需要兼容,只能选择vector?br />元素的查N度是否是关键的考虑因素Q如果是Q就要考虑哈希容器、排序的vector和标准关联容?#8212;—或许q就是优先顺序?br /><br /><br /><span style="font-size: 14pt"><strong>保容器中的对象拯正确而高?br /><br />调用empty而不是检查sizeQ)是否?0<br /></strong></span><span style="font-size: 12pt">理由很简单:emptyҎ有的标准容器都是常数旉操作Q而对一些list实现Qsize耗费U性时间。由于list所独有的链接操作?br /><br /></span><span style="font-size: 14pt"><strong>区间成员函数优先于与之对应的单元素成员函数?br /><br /></strong></span><span style="font-size: 14pt"><strong>如果容器中包含了通过new操作创徏的指针,切记在容器对象析构前指针delete掉。切勿创建包含auto_ptr的容器对象。问题的Ҏ只是在于auto_ptr不是q样的智能指针?/strong></span><span style="font-size: 12pt"><br />永远都不要错误的认ؓQ你可以通过创徏auto_ptr的容器指针被自动删除?br /><br /><font size="5"><strong>慎重选择删除元素的方?br /></strong>erase是指向紧随被删除元素的下一个元素的有效q代器?/font><span style="font-size: 12pt"><br /><br /></span><strong><u><em>要删除容器中有特定值得所有对?/em></u></strong><br />  如果容器使vector、string或dequeQ则使用earse-remove习惯用法?<br />  如果容器是listQ则使用list::remove<br />  如果容器是一个标准关联容器,则用它的erase成员函数?br /><br /><strong><em><u>要删除容器中满特定判别式(条gQ的所有对?/u></em></strong><br />  如果容器是vector、string或dequeQ则使用erase-remove_if的习惯用法?br />  如果容器是listQ则使用list::remove_if?br />  如果容器使一个标准关联容器,则用remove_copy_if和swapQ或者写一个@环来遍历容器中的元素Q记住当把P代器传给eraseӞ要对它进行后~递增?br /><br /><strong><em><u>要在循环内部做某些(除了删除对象之外的)操作</u></em></strong><br />  如果容器使一个标准序列容器,则写一个@环来遍历容器中的元素Q记住每ơ调用eraseӞ要用它的q回值更新P代器?br />  如果容器是一个标准关联容器,则写一个@环来遍历容器中的元素Q记住当把P代器传给eraseӞ要对q代器作后缀?/span><span style="font-size: 14pt">增?br /><br /></span><span style="font-size: 14pt"><strong>切勿对STL容器的线E安全性有不切实际的依</strong><span style="font-size: 14pt"><strong>赖?br /></strong></span><br /></span><span style="font-size: 12pt">  你不能指望STL库会把你从手工同步控制中解脱出来Q而且你不能依赖于MU程的支持?/span><span style="font-size: 14pt"><br /></span><span style="font-size: 12pt">  在容器所q回的每个P代器的生存期l束前,都锁住容?br /></span><span style="font-size: 12pt">  对于作用于容器的每个法Q都锁住该容器,直到法l束?/span><span style="font-size: 12pt">  多个U程L安全?br /></span><span style="font-size: 12pt">  多个U程对不同的容器作写入操作时安全的?br /></span><span style="font-size: 12pt">  对容器成员函数的每次调用Q都锁住容器直到调用l束?/span></p> <img src ="http://www.shnenglu.com/Daywei0123/aggbug/206473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Daywei0123/" target="_blank">Daywei</a> 2014-04-04 21:10 <a href="http://www.shnenglu.com/Daywei0123/archive/2014/04/04/206473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.gdlj2004.cn" target="_blank">޾Ʒþþþþο</a>| <a href="http://www.kaoyanonline.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.zaixianp29.cn" target="_blank">ɫþþۺ</a>| <a href="http://www.tjjobs.com.cn" target="_blank">þþƷ</a>| <a href="http://www.qvvj.cn" target="_blank">þɫۺҹž</a>| <a href="http://www.nanning315.cn" target="_blank">þþùƷ</a>| <a href="http://www.pjov.cn" target="_blank">þAAAAƬһ</a>| <a href="http://www.gta567.cn" target="_blank">þþƷӰԺ</a>| <a href="http://www.muxi365.cn" target="_blank">㽶97þ</a>| <a href="http://www.t2tt.cn" target="_blank">þˬˬˬ˾þþ</a>| <a href="http://www.lntyzx.com.cn" target="_blank">þֻоƷ߹ۿ</a>| <a href="http://www.lshwn.cn" target="_blank">Ʒþþþþù</a>| <a href="http://www.yangyongfu.com.cn" target="_blank">˾þav</a>| <a href="http://www.secwatch.com.cn" target="_blank">㽶þҹɫƷ2020</a>| <a href="http://www.swangxinwen.cn" target="_blank">þAV</a>| <a href="http://www.023job.com.cn" target="_blank">þþоƷĻ</a>| <a href="http://www.seomog.cn" target="_blank">þһۺ</a>| <a href="http://www.0379f.cn" target="_blank">97þþþ޾Ʒר</a>| <a href="http://www.201324.cn" target="_blank">þþavҰһ</a>| <a href="http://www.znaw.cn" target="_blank">ƷŮþþm</a>| <a href="http://www.10711.com.cn" target="_blank">ƷۺϾþþþþ97</a>| <a href="http://www.ihi7113575.cn" target="_blank">㽶þ99</a>| <a href="http://www.ifim.cn" target="_blank">ɫ͵͵͵þ˴ý</a>| <a href="http://www.wcjty.cn" target="_blank">һһþaþþƷۺ</a>| <a href="http://www.ppynw.cn" target="_blank">þþþþ޾Ʒ</a>| <a href="http://www.silverprice.net.cn" target="_blank">޹˾þþƷ</a>| <a href="http://www.c825.cn" target="_blank">þó18վ</a>| <a href="http://www.cdhjym.cn" target="_blank">þþžȫ</a>| <a href="http://www.mdz8.cn" target="_blank">þAV</a>| <a href="http://www.thyc.com.cn" target="_blank">þ99þ99Ʒӿ</a>| <a href="http://www.jxjkyt.cn" target="_blank">޾ƷҾþþþþ</a>| <a href="http://www.pqdaili.cn" target="_blank">޹Ʒһþhs</a>| <a href="http://www.qdpin.cn" target="_blank">ҹƷþ</a>| <a href="http://www.pzpt369.cn" target="_blank">þ</a>| <a href="http://www.153u.cn" target="_blank">պvavaŷvaþ</a>| <a href="http://www.yiqitong518.cn" target="_blank">Ʒþþþù</a>| <a href="http://www.hy129.cn" target="_blank">þŷƷ</a>| <a href="http://www.lzjsyg.cn" target="_blank">޹Ʒþþ</a>| <a href="http://www.enkids.cn" target="_blank">þúݺݰۺӰԺ</a>| <a href="http://www.inqh.cn" target="_blank">ɫۺϾþþþ </a>| <a href="http://www.789ff.cn" target="_blank">˾þô߽ۺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>