脚本的可控程度,复杂度等等,更容易影响语言的选择.
form中有几个属性可调。
1 有属性用于确定form显示在哪个屏幕上
2 有属性用于确定form显示在哪个坐标上
3 有属性用于确定form是居中在哪个屏幕上
“确实只测试过第一个例子”
--真的测试过了吗?怎么测试的?
for(i = 1;i < N;i ++)sum += i;
这个N到底加了没有?
从版本号也能看出来。asio目前只有0.3.9,还远未到开发完整。
因此,成熟自然也远未到。
第4种虽然可行,但还是不用为好。以免某些编译器不支持,同时也增加代码理解难度,而且在更复杂的情形中,这一招也无法解决问题。
还是第5种比较合适。
re: 去掉string里面的所有空格 沐枫 2007-11-30 16:16
优化工作完全交给编译器来做
--呵呵,这不是我说的,是你说的。我也不完全认同。
优化的问题太复杂了,不可能讨论的出来结果的,因为它与实际情况关系太密切了。
至于返回引用,的确是我看错了。不好意思。
用flashget或迅雷之类的下载工具,可以从微软站点全速下载的。
re: 去掉string里面的所有空格 沐枫 2007-11-30 11:37
@owlcn
就好象返回局部变量的指针一样。这样,有可能你可以运行,也有可能在某些时候就不能运行。。。
re: 去掉string里面的所有空格 沐枫 2007-11-30 11:36
效率高不高不是你认为不认为的问题。
而是实际使用环境造成的。
现在的编译器已经不是当年的编译器了。你要是没有把编译器的各种优化功能用好,就很难说哪种方法在哪个使用环境下,谁的效率更高。
就拿VC来说吧。VC除了各种编译时和链接时的优化外,还有一个按配置优化的功能。也就是让你的程序在运行中收集信息,经过一段长时间的使用以后,将收集的信息,让编译器根据这个信息对代码重新进行优化。这种优化才是真正的根据实际需要优化的。
re: 去掉string里面的所有空格 沐枫 2007-11-29 13:32
博主太恐怖了,居然敢返回string&.
re: 去掉string里面的所有空格 沐枫 2007-11-29 13:19
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
喏,还是很容易,一句就搞定了。
re: 汉语编程++ 沐枫 2007-10-18 19:41
想不到这个东西这么值钱,各位兄弟,赶紧行动起来,捞钱去喽
re: 汉语编程++ 沐枫 2007-10-18 19:40
汉字激光照排系统 这个名富其实。
但是其它几个居然敢跟它排在一起.....
re: 汉语编程++ 沐枫 2007-10-17 20:40
说实话,易语言还是有可取的地方,就是集成开发环境将程序流程和注释做的很醒目很好看。
re: 从赋值到初始化 沐枫 2007-10-06 23:10
@空明流转
我也用C#的啊?可是怎么不知道c#居然有构造函数多态行为。
你可能是指从一个构造函数调用另一个构造函数吧。
C++将会在下一个标准中增加这个功能。
re: 从for到foreach 沐枫 2007-09-27 22:53
@missdeer
好象、可能,这个说的很不地道。
性能的确会稍差,但差的是常数级别。循环体内是不差的。也就是说,大多数情况下可以忽略。
@梦在天涯
有更多的参数支持。但默认只支持10个以内。
需要更多的参数,要修改源代码中的一个宏定义。我以前曾看过,代码中有50个以内的参数定义预留。
re: 从for到foreach 沐枫 2007-09-27 16:12
@danielwyo
姓林的重名的实在是没有办法避免,我周围常能找到重名的。更何况拼音。
---
上面的例子实在是简单,因此,还不觉得那个iterator循环难看到哪去。一旦复杂度提高了,再那么写就很不顺眼了。
既使用foreach,也顶多改善一些罢了。
倒是对于.net引入的LINQ语法,很是向往。SQL当初面世的时候,曾被推宠,但直到今天也仅用于数据库。真正开始在一般的程序设计上普及,看来看去也只有LINQ了。
象上面的例子,用C#3.0写就是:
m_vecData
.Where(item => !item.IsBusy())
.All(item => item.DoSomeThing(param));
m_vecData.each {|item| !item.IsBusy() and item.DoSomeThing(param)}
re: 从for到foreach 沐枫 2007-09-27 15:13
并非完全要期待C++0x,那玩意儿至少要2年呢。
主要是为了希望能提高c++代码的可读性。
10多年前,刚学习C++的时候,为其倾倒,首要的,也是它在语言级上支持类,使得数据与算法的封装变得直观。
后来又加上函数重载和操作符重载,使得表达式变得简单清晰。
再后来,模板的出现,使得消除重复代码的同时还可以得到类型安全的保证。
这一切都是喜欢C++的理由。
然后,最终发现,这一切也变成容易写出坏味道甚至难以维护的代码的祸首。C++语法太过于低级,没有更高一级的抽象,造成了对很多人最终难学难用难看的印象和后果。
既然无法从语法级别上进行改进,那就只好从程序库中补充。因此,象BOOST等一系列的库,都在这上面花了不少力气。有许多人说这些库用的“技巧"旁门左道,因此而抵制。事实上,它们只是为了能够让别的人不需要用很深刻的技巧,而打造了一批让我们可以很顺手使用的程序库。
foreach 如此,format和assign如此,lambda,functional,bind,xpressive 等等,无不如此。
正是这些库能简化并提高程序设计的效率和可读性,才有了C++0x的提案和实践,也才有了C++语言的进化。
re: STL问题系列一 沐枫 2007-09-14 17:20
关于 < 的比较
你有没有注意到,大多数的STL算法,都只需要传进去一个比较函数就可以了?
默认情况下,传进去的就是 < 比较.
那么,如果你要比较 a == b 怎么办?
只有 !(a<b) && !(b<a)了.
所以,并非是说 ==的作用要小于<,而是条件所限.既然一个比较就可以了,总不能让你提供一大堆的比较函数吧?
re: STL问题系列一 沐枫 2007-09-13 22:53
1、《C++STL 中文版》第一章课后习题:1-4、解释为什么在所写算法中使用其他种类的迭代器,而不是随机存取迭代器?1-5、解释为什么宁愿定义一个仅能通过迭代器来存取的数据结构,而不是让他可以被随机存取呢?
>>
1-4,并不是说不能使用随机存取迭代器.比如sort就是使用随机迭代器.设计一个算法,要选择哪种迭代器,是要看具体什么算法.如果前向能满足,就选前向,否则才考虑双向,最后再考虑随机.
1-5,问题与1-4是一致的.这里也不是宁愿不宁愿的问题.不同的数据结构有不同的目的.没有特别的要求.这两个题稍有误导.主要是STL中的算法基本上都是通过迭代器存取.因此,符合迭代器的结构,就可以直接使用上这些算法.接口也统一,设计也清楚.
2、《C++STL 中文版》迭代器部分一直介绍输入、输去、前向、双向、随机迭代器,然而我以为只要以<iterator>建立的对象就具有随机迭代器的功能,为何讨论前向、双向呢?
>>
迭代器是一种存取容器数据结构的方式.并不是所有的容器都可以直接支持随机访问的,或者说,用随机访问效率非常低下.比如链表.(双向链表和单向链表等)
3、从《C++STL 中文版》第一章后面的习题看前向、双向、随机迭代器从性质和条件上有较大差别,请问这在深层上如何理解呢?
>>
显然,前向指只能向从前向后依顺序访问(如单向链表)
.双向指可以向前,也可以向后依顺序访问(如双向链表)
.随机,则是可以随机访问容器中的任何一个元素(如数组).
4、《C++STL 中文版》第二章习题:2-3“当T和U中有一个是const类型时,我们可能需要经常构造一个pair<T,U>对象。下面的定义是否可以达到这样的效果?如果不可以,请说出你的理由。
template<class T,class U>inline pair<T,U> make_pair(T& x,U& y)
{return (pair<T,U> (x,y));}”
>>
这个
这样的效果是什么效果?是指能不能构造成功?当然可以构造成功啦.例如:int a=2,b=4;pair<const int, int> c(make_pair(a,b));
5、《C++STL 中文版》2-4“请描述出一种可能的编码情况,使得表达式 x.first < y.first ||
!(y.first < x.first) && x.second < y.second 并不等同于 x.first < y.first || x.first == y.first && x.second < y.second。”
>>
没看过这本书.不明白要求什么写哪部份的编码.单从表达式来说.
随便写一个不符合要求的operator == 就好了(比如operator==返回<的结果).
6、STL在他的文件中定义了指针和引用,但同时还总是定义常指针和常引用,为何两者必须分开实现呢?
>>
常指针和指针...这指的是typedef吗?typedef谈不上实现不实现的吧.只不过是一个typedef而已啦.C++的typedef并不是一个真正的类型,只是类型的别称而已.
7、《C++STL 中文版》第四章:4-6“写出一个分配器,它将对象存储在一个磁盘文件中,并且维护一个小小的高速缓存来存储程序内存中的有效对象。”
>>
这个...为什么不自已试着写写呢.
8、《C++STL 中文版》第四章:4-7“在那种情况下,分配器应该以与模板类allocator不一致的方式来定义成员函数construct和destroy?”
>>
allocator的construct是用placement new来实现的.construct的目的就是用于调用构造函数.在C++中,似乎只有用placement new的方式来手工调用构造函数.不一致的话,是不是指不用调用构造函数,或是有特别的调用方式?想不出来可以不用调用构造函数的实现或别的调用方式.
或者是不一致的方式另有所指?
9、<algorithm>文件中sort_heap函数功能:void sort_heap(RanIt first, RanIt last)重排由区间[first,last)中的迭代器指定的序列,产生一个按 operator <排序的序列。但是最初的序列也必须是一个同样按 operator < 排序的堆。这样看,那该函数的实际意义呢?
>>答:
堆排序.按<排序的堆,并不等于整个序列是按<排好序的.例如:( 9 6 8 4 1 5 7 3 2 0 )就是按<排好序的堆.但按<排好序的序列是(1 2 3 4 5 6 7 8 9)
re: STL问题系列一 沐枫 2007-09-13 21:48
这个不要放在首页吧...
什么会自已写分隔函数呢?
c库就有一个strtok挺好的。
呵呵,不用担心,C++0x已经确定了这个特性,就是>>中间不需要空格。
新的g++和vc9都已经支持了这个特性了。
re: File I/O 沐枫 2007-08-14 00:48
其实,这个功能,VisualStudio的C++编译器已经提供了。
/FI[ ]pathname
此选项使预处理器处理指定的头文件。此选项的作用与在命令行上、CL 环境变量中或命令文件中指定源文件,并同时在每个源文件的第一行上的 #include 指令中用双引号指定该头文件相同。如果使用多个 /FI 选项,将按 CL 处理文件的顺序来包含这些文件。
在 Visual Studio 开发环境中设置此编译器选项
打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。
单击“C/C++”文件夹。
单击“高级”属性页。
修改“强制包含”属性。
re: 用c++,写小型病毒 沐枫 2007-08-02 11:47
joker
re: C++指针探讨 (四) 函数对象 沐枫 2007-07-21 23:07
@pass86
差太多了。
re: C++高效编程忠告 沐枫 2007-07-20 12:00
@金庆
就是必须的,所以才是一种妨碍。
目前C++有3种编程:c, 类, 模板。
其中,头文件对于c来说,并不成问题,甚至还带来许多便利。
但是对于类,和模板,特别是模板来说,麻烦就大了。
对于类来说,封装性和实现隐藏是一个很重要的概念,但大多数情况下,许多人都不容易做到这一点。.h文件中会有许多私有的数据成员,甚至还有不少的函数实现(如inline函数),从而对封装性和实现隐藏造成破坏,造成编译依赖,进一步造成编译器的复杂度提高。最终为了避开这些问题,将会造成库设计要求的提高。
至于模板风格的编程就更不得了,目前几乎没有支持分离模板的编译器。况且即便分离了,又能怎么样?最终的结果是,大多的模板风格的程序,所有的代码都在.h文件中,.cpp反而只剩了一句话:#include "xxx.h",没了。
re: C++高效编程忠告 沐枫 2007-07-19 19:21
闲来无聊,无聊一下:
2 头文件的作用
这是由于历史原因造成的。
头文件主要用于存放接口声明,以便不同的c文件共享函数声明。
到了c++中,已经造成一种妨碍了。
3 * & 的位置
这个位置放哪,虽然要紧,但更要紧的是,遵守一个变量一行定义。这样就不会出现错误,也很好读。如:
int * i;
int j;
4 if
仍然是历史原因造成的。c标准中没有真正的bool类型(c++98和c99加了),而是用int来代替,这就造成了麻烦。所以新写的程序要避免使用BOOL,而用bool来替代。
如果是旧标准的编译器,仍然要注意BOOL其实是int这个要点。
5 const #define enum
这几个各有用途,有时候也不能互代。使用时,优先顺序 enum const #define。看具体要求,不一定非要怎么怎么样。
6 参数传递
用指针或用引用,倒不定要要争个谁好谁坏。
实际上,用指针还更容易让人明白传进去的是指针。而引用则不然。引用的引入,在c++中是为了解决运算符重载的问题。
不过,不管用哪个,倒是建议优先采用 const T* 或const T&,这种常量指针或常亘引用。这不仅关系程序优化,也关系到代码的质量。
8 memcpy
除非没有类似的库函数,否则不要重新写一个。要知道,绝大多数编译器会对这些库函数作特殊优化。这是手工编码无法做到的。
11 字串
建议不要使用strcpy,strcmp类似的函数,应该改为strncpy, strncmp等函数。目前新型的编译器会认为strxxx函数是非法的(被淘汰的),建议用strnxxx,或者编译器提供的更安全的版本。
13 指针的大小
与编译器及系统平台有关。大小从2/4/8/16各种可能性都有.不要认死了。
14 关于new/delete 与malloc/free
你用了类似class的关键字后,就注定不兼容于c了。因此,用了c++的东西,就不要去用mallco/free,除非特殊情况。
同理,不使用c++的东西,也决不要去用new /delete.
否则,你的跨语言或跨平台的想法就打水漂了。还容易出错。
15 const 函数
const不一定只能引用const成员。它可以使用任何成员,只是默认情况不能改变成员的值而已。如果成员被定义为mutable(c++98),则不限制。
18 #ifdef
说的太绝对了。而且没有任何说明如何做。
事实上#ifdef能做的事还是挺多的。
re: 8行撰写的一个备份工具 沐枫 2007-07-19 18:47
at + rar 简单配置一下就可以代替程序了。
或者是.bat + rar.exe 都行的通,去写程序,反而不灵活。
re: 消除障眼法-一个编译错误 沐枫 2007-07-19 10:14
@梦在天涯
一致性是很重要的。没了一致性,不但这个库函数是很难用的,而且也是很容易出错的。
re: do...while(0)的妙用 沐枫 2007-07-04 11:07
比如文件, 数据库链接,网络连接等等这些都可以设计一个资源维护的guard来保护。
比如MFC的CFile就有这个功能。
re: do...while(0)的妙用 沐枫 2007-07-04 10:34
do{}while(0)
在于宏定义上的使用是无疑的。我在设计库的时候,是常用的。
但是对于第一点,用于消除goto,举的例子很不恰当。
而且,代码中常常有一些循环语句。此时,从内循环是无法用break跳出到外循环,仍然得用goto,这样,do while(0)就变得多余了。
用auto_ptr等自动守护(guard)机制是更好的选择:
bool Execute()
{
// 分配资源
auto_ptr<int> p = new int;
// 执行并进行错误处理
if(!func1())
return false;
if(!func2())
return false;
if(!func3())
return false;
//...
return true;
}
re: FreeType2研究 沐枫 2007-05-22 15:51
你得到一个“口”,估计是字体文件没有对应的字符。
你可以用 simsun.ttf试试。
re: 发现自己土了[未登录] 沐枫 2007-05-04 11:36
博主又错了。这跟土不土没有关系。
1. boost::bind并非无限参数。一般不会超过20个。
2. 既使没有boost::bind,std::bindxxx和std::mem_funxxx配合,也能达到同样的效果。虽然参数不能超过2个。
3. 即使如此,自已去做一次,也有助于对C++机制的了解。
4. 如果你有需要什么功能,那么可能已经有现成的实现了。就看你是否有找到。
re: 命令行界面VS图形界面 沐枫 2007-04-29 19:24
各有其应用范围,不要厚此薄彼。摆正心态,根据实际情况,适当选择,或同时提供。
re: 计算Int最大最小值 沐枫 2006-12-25 11:56
为啥用函数呢...
const int INT_MAX = ~0;
这样不挺好的。
re: 生成无重复的随机数 沐枫 2006-12-05 18:23
你的方法1)因为需要保存随机数历史数据,因此仍然是需要空间消耗的。而且空间消耗与方法2)比起来,没区别。
--
至于方法2)的交换方法,VS2005中的std::random_shuffle函数就是这么做的。
re: FreeType2研究 沐枫 2006-11-11 12:08
汉字码是Unicode。用相应汉字的Unicode编码,就可以取到了。
re: 百度公司来科大的面试题 沐枫 2006-11-10 10:54
27cm,对半后是13.5cm.
1. 这样,离最近末端最大距离是11cm,因此,最小时间是11秒。
2. 离最远的末端最大的距离是27-3=24cm,因此,最大时间是24秒。
对不对,请指教?
re: 百度公司来科大的面试题 沐枫 2006-11-10 10:25
呵呵,确实是智力题啊。
最小时间很快就出来了。
最大时间,刚一开始给矇了。然后看到提示,就霍然开朗了。
然后果然心算就出答案了。
--
问题是心算出答案的题目,如果用程序实现,那不变成了直接输出答案了,这如何写算法呢?太简单的算法,不如不写。写复杂了,就不是最优算法了。
re: FreeType2研究 沐枫 2006-11-08 23:48
以前有用过ft2,但是发现,在简体中文windowsxp下面,显示繁体中文时,显示位置会不对。
re: 关于String类的笔试题及解答 沐枫 2006-10-27 10:23
operator=存在一个异常安全问题。
假设,执行到new char[]时,发生异常,这时,原有的内容已经被delete掉了。这时,operator=扔出异常,同时,原有的对象已经不能用了。
re: Return of Turbos 沐枫 2006-09-08 08:54
我装好了。试用了一下。
感觉上,就是bds2006的sp.
IDE仍然还是bds2006的那一套(bds4.0),只不过,bds2006带的C++Builder是preview,这回是正式版。
并没有值得纪念的新特性在内。
不过,如果品质有提升,那也是挺不错的了。毕竟现在也还是2006年啊。
内置式new,不是一个好的(甚至是不正确的)译法。
曾有人提过:就地创建。但有人不喜欢“就地”两字。
所以,不喜欢的话,如没有适当的译法,还是用placement new这样的原文比较好。
re: 关于String类的笔试题及解答 沐枫 2006-07-14 09:24
operator = 不是异常安全的。
string不需要operator()操作。
String str1 = str;//调用拷贝构造函数
这个听说是C++标准规定的。
re: 递归和递推的非严格概念解释 沐枫 2006-07-10 09:14
有递推这种算法形式吗?还是说,只是为了与递归对应,不是递归就是递推?
文中的解释,觉得是从算法上来说明。其实,递归,应该是一种计算机的算法表达形式,它指的应该是有限制的直接或间接重复调用自身的一种子程序。