G.2 大部分容器都有的成员(1)

2013-10-07 15:49:30 · 作者: · 浏览: 68

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都将是类型的名称。这些考虑因素导致了下面的定义:
 
这样,便可以这样使用该模板函数: