2007年6月6日水曜日

STL:for_each

For_each
template <>
Function for_each (InputIterator first, InputIterator last, Function f);

对范围[first, last]内的每一个元素调用函数f。
这个模版函数的行为跟下述代码类似:

template
Function for_each(InputIterator first, InputIterator last, Function f)
{
while ( first!=last )
f(*first++);
return f;
}


参数:
first, last
对应序列中最初位置和最后位置的输入迭代器。其适用范围是[first, last]包含在first和last之间的所有元素,包括由first指向的元素,但是不包括last指向的元素。
F
将范围中一个元素作为参数的一元函数。这可以一个函数指针,也可以是类中重载了操作符()的类对象。

返回值
跟f的返回值相同。

示例:
// for_each example
#include
#include
#include
using namespace std;
void myfunction (int i)
{ cout << " " <<> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:"; for_each (myvector.begin(), myvector.end(), myfunction); // or: cout << "\nmyvector contains:"; for_each (myvector.begin(), myvector.end(), myobject); cout <<>
#include
#include
using namespace std;
struct print {
void operator()(const int& i)
{ cout << n =" 5;"> iv(input, input+N);
for_each(iv.begin(), iv.end(), &printfun);
cout << endl;
}

输出:
for_each
1,2,3,4,5,
1,2,3,4,5,

复杂度:
线性复杂度:仅对每个元素使用一次函数f

2007年6月5日火曜日

Win32 API 入门

WinMain函数
入口点
首先,为了进行Windows编程包含一些头文件是必要的。要包含一个定义Windows程序的形式、结构体、常数和函数调用的头文件。
Windows程序一个主要的包含文件是windows.h。在这个头文件中包含了其它头文件。在Windows程序中必须包含这个头文件。

其次,Windows编程中重要的一点是没有main()函数,程序开始的地方是WinMain()函数。Windows程序的应用程序入口是WinMain()函数。
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
出于一些原因,这个函数的参数比较复杂。首先,注意函数名前的WINAPI。WINAPI在windef.h中的定义如下:
#define WINAPI __stdcall
__stdcall是Win32 API函数调用时的规则。几乎所有的Windows API函数都有WINAPI修饰。

第一个参数是被叫做实例句柄(instance handler)类型的参数。句柄(handler)是为了识别是什么而使用的数值。实例句柄是用于识别程序的句柄。在调用某些Win32 API时,要把它作为参数。

第二个参数是Win16的产物。Windows是能够同时启动同一个程序的多个实例运行的。在Win16中,同一应用程序的实例是共享内存的,要通过这个参数来让自身和其它实例来进行区别。但是Win32中这个实现是不同的,所以第二个参数总是为NULL。

第三个参数是命令行获得的参数。LPSTR这个类型,是Windows标准的字符串类型(在以后的章节中说明)。

第四个参数用来指定应用程序最初的显示方式。我们现在还不知道窗口的制作方法,所以这个参数在以后才详细说明。

这里,我们看一下一个最简单的程序:
#include
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow )
{
return 0;
}
这个程序目前还什么也不做。但是对于理解WinMain()非常重要。

Win32 API

关于Win32 API
Windows编程
在这里,我们将解说Microsoft公司的Windows操作系统的编程。为了进行Window编程,可以操作Windows提供的API。所谓API,是Application Programming Interface的缩写,是应用程序对操作系统进行操作的必经之路(是由系统开发者提供的)。

熟练的操作Windows API对于进一步理解Windows编程和Windows操作系统的运行机制都是非常重要的。但是,也因此很难理解的部分很多,对编程经验的要求也高。

为了学习Windows API,有很多基础知识是必要的。阅读本讲座的最低要具有C语言的知识。还要对Windows 操作系统(9x、 NT两者之一)很熟悉。第三,必须对文字编码和计算机体系结构有详细的了解。要能够理解Unicode和CISC, RISC等术语。首先要掌握的是信息技术相关的基础知识。

Windows编程的方法
本讲座中主要讲的是在Microsoft Visual C++ 6.0等开发环境下用C语言调用API的Windows编程的一般方法。

需要多次说明的是,该讲座的学习需要必要的C语言基础知识,但是Windows编程的方法并不仅限于此。还有在Microsoft Visual Basic, Boland Delphi等手段以及Sun Microsystems公司的java等手段。如果使用Microsoft Visual C++,那么还支持MFC类库等编程方法。

上述的方法远比直接操作API简单易学。如果想既重视开发效率又重视管理,那些都是比较好的方式。但是,如果通过讲座中的方法了解了API的知识,就能过完成效率更高的程序。不管怎样,直接操作API的方法,能够得到最好的OS机能。