博文
什么是STL(2010-11-03 15:40:00)
摘要: 在C++标准中,STL被组织为下面的13个头文件,STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
一、STL简介
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。以下笔者就简单介绍一下STL各个部分的主要特点。
二、算法
大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stab......
C++数据类型基础知识(2010-11-03 14:48:00)
摘要:char :字符类型
int : 整型
float :单精度实型(浮点型)
double : 双精度实型
unsigned : 无符号类型
signed : 有符号类型
bool : 布尔类型
true : 布尔类型的真值
false : 布尔类型的假值
void : 无类型
sizeof : 取得指定类型的所占用的范围
typedef : 为某种类型取一别名
类型标识符
类型说明
长度
(字节)
范围
备注
char
字符型
1
-128 ~ 127
-27 ~ (27 -1)
unsigned char
无符字符型
1
0 ~ 255
0 ~ (28 -1)
short int
短整型
2
-32768 ~ 32767
2-15 ~ (215 - 1)
unsigned short int
无符短整型
2
0 ~ 65535
0 ~ (216 - 1)
int
整型
4
-2147483648 ~ 2147483647
-231 ~ (231 - 1)
unsigned int
无符整型
4
0 ~ 4294967295
0 ~ (232-1)
float
实型(单精度)
4
1.18*10-38 ~ 3.40*1038
7位有效位
double
实型(双精度)
8
2.23*10-308 ~ 1.79*10308
15位有效位
long double
实型(长双精度)
10
3.37*10-4932 ~ 1.18*104932
19位有效位
......
C++编程杂谈之一:编译器(2010-11-02 15:52:00)
摘要:C++编程杂谈之一:编译器
作者/xulion
网上有很多各种编译器的优劣比较的东西,我写这些东西并不是想支持或否定某些东西,因为我始终认为在编程的领域中,我只是一个初学者,并没有资格来评判什么(况且我也不想去评判),我只是想讲述一下个人学习道路上的感受。
学编程的一个必备的条件是你要有一个实践的平台--一个相应的编译器,没有这个条件,一切都是空谈。选择编译器之前,首先选择的是语言(这个我想不必更多的解释了),这里我假设你选择了C或C++。
现在最流行的编译器恐怕应该是微软的VC了,在继续之前,我想再提一下一个重点:VC是一个编译器,只是一个用来把C++的代码生成为可执行文件的工具而已(当然我说的有一些简化,但是认识这一点很重要,虽然你可以在很多地方看到类似的话,但我还是要提,我希望每一个学习编程的人最好从一开始就知道它,而不是走了很多弯路以后再来醒悟)。另外一种强大的编译器就是Borland C++ Builder(后面我都将以BCB来代替)。
如果你在使用VC,我想问一下,你为什么用它?我想很多人根本无法回答这个问题,大多无法回答的原因很明显:1)听说的,VC是最好的;2)微软的产品;3)只知道这个。当然更有甚者是一开始就把VC作为一门语言来学,呵呵,我相信一定有这样的人的!每当谈及这些问题的时候,我会觉得很多时候,软件行业中技术并不是优秀软件的全部,VC一定是最好的么?VC为什么会这么成功?我不得不佩服微软的商业策略。关于VC是如何成功的,我强烈推荐一篇文章--《C/C++圣战》,作者李维,《程序员》杂志2001.10月。
一个编译器究竟带给我们什么?在早期,编译器其实就是一个简单的文本编辑器+库(头)文件+编译程序,很多早期的程序员会使用一些其他的编辑器来书写自己的程序,然后再使用编译器来编译。现在我们使用的编译器通常称为集成开发环境(IDE),这一类型的开发环境为我们提供了很多东西:方便的开发方式、完善的帮助系统、丰富的库和一些特有的特性。
在某个特定的平台下编程你需要关心的主要有两件事情:1.是否支持你所使用的语言;2.平台特性(......
【转】#include<iostream.h>和#include<iostrea(2010-10-28 22:07:00)
摘要:C++中新定义的方法都是有名字空间的 比如cout就属于std名字空间 如果include头文件的时候加上.h,默认会using namespace 否则需要自己加上 using namespace XXX 对于C中已经定义的方法如printf,没有影响的
iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了
但用iostream要加名词空间namespace
#include<iostream.h>
或者是
#include<iostream>
using namespace std;
二者都行
#include<iostream.h>是C语言中比较通用的
#include<iostream>
using namespace std;
是C++中比较通用的
#include <iostream.h>这样写,里面的函数都是全局函数.
不加.h的是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改
而加.h的是c语言的用法,但是在c++中也支持这种用法,主要是为了向下兼容c 的内容,我们平时尽量不用这种方法
iostream是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改。 iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文 件和新头文件中的实体不一定完全对应。) 一般情况下应该用这个头文件,而iostream.h则是老式的,以后有可能被淘汰。
经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。
现在来看看下面两个include:
&......
VC++6.0学习(2008-04-20 15:16:00)
摘要:关于头文件Stdafx.h
Standard Application Fram Extend 没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。 Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。 为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示: ◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。 ◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。 ◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。 ◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。) ◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编缉了stdafx.cpp或stdafx.h。 这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则: ◎你编写的任何.cpp文件都必须首先包含stdafx.h。 ◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。 ◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。 如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。......
C++个人回顾小结: 类(四)&&个人实践小结(2006-12-16 16:26:00)
摘要:静态成员
一、静态数据成员
目的:实现多个对象之间的数据共享。是类的所有对象中共享的成员。
可以节省内存,是所有对象所公有的。只存储一处,供所有对象共用。
用法和注意事项:
1、在定义或说明前面加关键字static
2、初始化为如下格式:
<数据类型><类名>::<静态数据成员>=<值>;
初始化时不加该成员的访问权限控制符private,public等。
必须对它进行初始化。
3、引用静态数据成员时,采用如下格式:
<类名>::<静态成员名>
#include<iostream.h>class Myclass{ public: Myclass(int a, int b, int c); void GetNumber(); void GetSum(); private: int A, B, C; static int Sum;};int Myclass::Sum=0;Myclass::Myclass(int a, int b, int c){ A=a; B=b; C=c; Sum+=A+B+C;}void Myclass::GetNumber(){ cout<<"Number="<<A<<","<<B<<","<<C<<endl;}void Myclass::GetSum(){ cout<<"Sum="<<Sum<<endl;}
void main(){ Myclass M(3,7,10),N(14,9,11); M.GetNumber(); N......
C++个人回顾小结: 类(三)&&个人实践小结(2006-12-16 11:38:00)
摘要:内联函数和外联函数
内联函数:定义在类体内
外联函数:定义在类体外
内联函数的特点:
调用时在调用函数处用内联函数体的代码进行替换,节省调用开销,提高运行速度。
外联函数变成内联函数的方法:
在函数头前面加上关键字inline。
class A{ public: A(int x, int y){X=x;Y=y;} int a(){return X;} int b(){return Y;} int c(); int d(); private: int X,Y;};inline int A::c(){ return a()+b();}inline int A::d(){ return c();}
#include<iostream.h>void main(){ A m(3,5); int i = m.d(); cout<<"d() return:"<<i<<endl;}
输出:
d() return:8
函数的重载性:
class M{ public: M(int x, int y){X=x;Y=y;} M(int x){X=x;Y=x*x;} int Add(int x, int y); int Add(int x); int Add(); int Xout(){return X;}......
C++个人回顾小结: 类(二)&&个人实践小结(2006-12-12 21:48:00)
摘要:拷贝初始化构造函数:
1、函数名同类名,也是一种构造函数,并且不被指定返回类型。
2、函数只有一个参数,并且是对某个对象的引用。
3、每个类都必须有一个拷贝初始化构造函数:
<类名>::<拷贝初始化构造函数名>(const<类名>&<引用名>)
以下代码放在名为tpoint1.h的头文件当中
class TPoint{ public: TPoint(int x, int y){X=x; Y=y;} TPoint(TPoint & p); ~TPoint(){cout<<"Destructor Called.\n";} int Xcoord(){return X;} int Ycoord(){return Y;} private: int X, Y;};TPoint::TPoint(TPoint & p){ X=p.X; Y=p.Y; cout<<"Copy_initialization Constructor Called.\n";}以下放在另一文件当中
#include<iostream.h>#include"tpoint1.h"TPoint f(TPoint Q);void main(){ TPoint M(20,30),P(0,0); TPoint N(M); P=f(N); cout<<"P="<<P.Xcoord()<<","<<P.Ycoord()<<endl;}TPoint f(TPoint Q){ cout<<"ok\n"; int x,y; x=Q.Xcoord()+10; y=Q.Ycoord()+20; TPoint R(x,y); return R;}
执行结果:
Copy_initialization Constructor Called.
Copy_initiali......
C++个人回顾小结: 类(一)&&个人实践小结(2006-12-01 16:35:00)
摘要:这两天,复习了C++的类的一部分内容,当然是从最最基础的开始,以下就把一些复习的东西和大家共享一下:
一、类的定义部分:
举例如下:
#include<iostream.h>
class TDate{ public: void SetDate(int y, int m, int d); int IsLeapYear(); void Print(); private: int year, month, day;};
void TDate::SetDate(int y, int m, int d){ year=y; month=m; day=d;}
int TDate::IsLeapYear(){ return (year%4==0&&year%100!=0)||(year%400==0);}void TDate::Print(){ cout<<year<<","<<month<<","<<day<<endl;}类定义注意事项:
1、类体中不允许对所定义的数据成员进行初始化,如下的定义是错误的
class TDate
{
public:
private:
int year(1998),month(4),day(9)
};
2、类中的数据成员可以是任意的,包含引用、指针等。也可以是对象:另一个类的对象
但是自身类的对象是不可以的。而自身类的指针或引用又是可以的。当一个类的对象作为这个类的成员时,如果另一个类的定义在后,需要提前说明。
class N;
class M;
{
public:
private:
N n; ......
C++个人回顾小结: 函数(二)&&个人实践小结(2006-11-26 17:15:00)
摘要:函数的作用域
作用域的种类:
程序级:所有文件。外部函数。外部变量。
文件级:内部函数 外部静态类变量
函数级:函数的形参 函数内定义的自动类变量 内部静态类变量 语句标号
块级:定义在函数体内的分程序中、if、switch以及循环语句当中
关于重新定义标识符的作用域范围,例:
void fun()
{
int a;
{
float a;
}
}
int 型变量a在整个函数fun内都是有效的、可见的。而float型变量a仅在定义它的分程序内是可见的,在该分程序前和后的函数体内是不可见的。
关于一个标识符的可见性和存在性,有时是一致的,例如上例中的float型变量a;有时是不一致的,例如上例中的int型变量a,它在分程序内虽然不可见的,但是它是存在的。
举例:
#include<iostream.h>void main(){ int a(5),b(7),c(10); cout<<a<<","<<b<<","<<c<<endl; { int b(8); float c(8.8); cout<<a<<","<<b<<","<<c<<endl; a=b; { int c; c=b; cout<<a<<","<<b<<","<<c<<endl; } cout<<a<<","<<b<<","<<c<<endl; } cout<<......
