C++标准程序库中的基本概念

  • template(模板)

所谓templates,是针对“一个或多个尚未明确的型别”所撰写的函数或类别。当使用template时,可以显式地(explicity)或隐式地(implicitly)将型别当作参数来传递。

例如,下面传回两数之中的较大数:

template<class T>
inline const T& max(const T& a,const T& b)
{
	return a < b ? : b : a;
}

第一行将T定义为任意数据类型,函数被调用时由调用者指定。这个型别由class引导,但型别本身不一定得是class——任何数据型别只要是提供template定义式内所用到的操作,都可适用于此template

  • 命名空间(Namespaces)

 Namespaces将不同的标识符号集合在一个具名作用域内。如果你在namespace之内定义所有标识符号,则namespace本身名称就成了唯一可能与其它全局符号冲突的标识符号,必须在标识符号前加上namespace名字,才能援引该namespace内的符号。namespace的名字和标识符号之间以::分隔开来。

namespace AA {
	class File;
	void myGlobalFunc;
	...
}
...
//using a namespace identifier
AA::File obj;
AA::myGlobalFunc();
  •  main()的定义式

 根据C++标准规格,只有两种main()是正确而可移植的:

int main()
{
	...
}

int main(int argc, char* argv[])
{
	...
}

argv是命令行参数,也可以定义为char**。函数返回类型必须写明为int。

  • 命名空间(namespace)std

当你采用不同的模块和程序库时,经常会出现名称冲突现象,这是因为不同的模块和程序库可能针对不同的对象使用相同的标识符。所谓的namespace就是指标识符的某种可见范围。

实际上,C++标准程序库中的所有标识符都被定义在一个名为std的namespace中。

对于C++标准程序库的任何标识符,有三种选择:

①直接指定标识符

std::cout << std::hex << 3.4 << std::endl;

 ②使用using declaration

using std::cout;
using std::endl;

cout << std::hex << 3.4 << endl;

 ③使用using directive。可以让std内定义的所有标识符都有效

using namespace std;

cout << hex << 3.4 << endl;
  •  STL组件

容器Containers,用来管理某类对象的集合。为了应对程序中的不同需求,STL准备了不同的容器模型。常见的有

        array;vector;list;forward_list;queue;deque;stack;

        set/multiset;map/multimap;unordered_set/unordered_map;

迭代器Iterators,用来在一个对象集群的元素上进行遍历动作。迭代器的主要好处是为所有容器提供一组很小的公共接口,利用该接口,某操作就可以行进至群集内的下一个元素。可以将迭代器视为一种smart pointer。

算法Algorithms,用来处理群集内的元素。

分配器Allocator,负责空间配置与管理,从实现的角度来看,分配器是一个实现了动态空间配置、空间管理、空间释放的class template

适配器Adapter,一种用来修饰容器或仿函数或迭代器接口的东西,(就像插座220V电压连接到电脑之前要先经过变压器一样)

仿函数Function object,行为类似函数的类。

STL的基本观念就是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互作用。

STL将数据和算法分开对待,从某种意义上说,STL的概念和面向对象程序设计(OOP)的思想是矛盾的。然而,它允许你将各种容器与各种算法结合起来,在很小的框架内拥有非常大的弹性。 

猜你喜欢

转载自blog.csdn.net/yangSHU21/article/details/131534185