G.2 大部分容器都有的成员(1)
所有容器都定义了表G.1列出的类型。在这个表中,x为容器类型,如vector<int>;T为存储在容器中的类型,如int。表G.1中的示例阐明了含义
表G.1为所有容器定义的类型
|
类 型< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
值 |
|
x::value-type |
T,元素类型 |
|
x::reference |
T & |
|
x::const_reference |
const T & |
|
x::iterator |
指向T的迭代器类型,行为与T*相似 |
|
x::const_iterator |
指向const T的迭代器类型,行为与const T *相似 |
|
x::different_type |
用于表示两个迭代器之间距离的符号
整型,如两个指针的差 |
|
x::size_type |
无符号整型size_type可以表示数据对
象的长度、元素数目和下标 |
类定义使用typedef定义这些成员。可以使用这些类型来声明适当的变量。例如,下面的代码使用迂回的方式,将由string对象组成的矢量中的第一个"bonus"替换为"bogus",以演示如何使用成员类型来声明变量。
上述代码使r成为一个指向(want指向的)input中元素的引用。同样,继续前面的例子,可以编写下面这样的代码:
这将导致s1为一个新string对象,它是input[0]的拷贝;而s2为指向input[1]的引用。在这个例子中,由于已经知道模板是基于string类型的,因此编写下面的等效代码将更简单:
然而,还可以在更通用的代码中使用表G.1中较精致(其中容器和元素的类型是通用的)的类型。例如,假设希望min( )函数将一个指向容器的引用作为参数,并返回容器中最小的项目。这假设为用于实例化模板的值类型定义了<运算符,而不想使用STL min_element( )算法,这种算法使用迭代器接口。由于参数可能是vector<int>、list<strint>或deque<double>,因此需要使用带模板参数(如Bag)的模板来表示容器(也就是说,Bag是一个模板类型,可能被实例化为vector<int>、list<string>或其他一些容器类型)。因此,函数的参数类型应为const Bag & b。返回类型是什么呢?应为容器的值类型,即Bag::value_type。然而,在这种情况下,Bag只是一个模板参数,编译器无法知道value_type成员实际上是一种类型。但可以使用typename关键字来指出,类成员是typedef:
对于上述第一个定义,编译器能够访问vector模板定义,该定义指出,value_type是一个typedef;对于第二个定义,typename关键字指出,无论Bag将会是什么,Bag::value-type都将是类型的名称。这些考虑因素导致了下面的定义:
这样,便可以这样使用该模板函数: