vector/list/map

来源:互联网 发布:数据建模分析 工具 编辑:程序博客网 时间:2024/05/23 00:00

vector
vector可能是应用最广泛的容器类。vector支持动态数组,即可以依据需要扩充的数组。在C++中,一个数组的大小在编译时就已确定了,这是应用数组最有效的途径,也是限制性最大的方法,程序无法在运行时调节数组的大小来适应变化的程序条件。vector容器通过依据需要分配内存解决了这一问题。vrctor虽然是动态的,但依旧可以通过标准数组来访问其元素。
vector模板定义:template <calss T, class Allocator=allocatoe<T>> class vector。其中T是存储在vector中的数据类型。Allocator指明了这里使用的标准缺省内存配置器。vector有以下构造器:
explicit vector(const Allocator &a=Allocator( ));
explicit vector(size_type num, const T &val=T( ), const Allocator &a=Allocator( ));
vector(const vector<T, Allocator> &ob);
template <class InIter> vector(InIter start, InIter end, const Allocator &a=Allocator( ));
第一种形式构造一个空的vector容器。第二种形式构造一个有num个值为val的元素的vector容器,其中val可以是缺省值。第三种形式构造一个和ob容器元素相同的vector容器。第四种形式的构造函数构造一个元素范围由迭代器start和end确定的vector容器。为了满足作大的灵活性,所有存储在vector容器中的对象应定义缺省的构造函数。vector定义了诸多比较运算符,如:==,<,<=,!=,>,>=。还定义了下标运算符[],允许使用标准的数组下标运算符访问vector中的元素。
vectror容器功能很强,且安全性好,适应性强。但是效率比普通数组低,所以大多数程序中可酌情考虑使用数组还是vector容器。

 

list
list类支持双向线性列表。不能像vector那样支持随机访问,只支持顺序访问,由于list是双向的,所以可以从前向后也可以从后向前访问列表。
list容器模板定义:template <calss T, class Allocator=allocatoe<T>> class list。构造函数如下:
explicit list(const Allocator &a=Allocator( ));
explicit list(size_type num, const T &val=T( ), const Allocator &a=Allocator( ));
list(const vector<T, Allocator> &ob);
template <class InIter> list(InIter start, InIter end, const Allocator &a=Allocator( ));
第一种形式的构造函数构造一个空的list容器;第二种形式的构造函数构造一个有num个值为val的list函数,其中val为缺省值;第三种形式的构造函数构造一个与ob有相同元素的list容器;第四种形式的构造函数构造一个元素范围由迭代器start和end确定的容器。list容器定义了如下比较运算符:==,<,<=,!=,>,>= 。成员函数与vector基本相似,特殊的:splice函数将两个list连接在一起;merge函数将一个list并入另一个list。
容器函数end( )。并不返回指向容器的最后一个元素的指针,它返回的指针指向最后一个元素后面的位置。所以end( )-1才是指向容器的最后一个元素。当迭代器与end( )函数返回的值相等时,说明容器中所有的元素都被访问到了。由前端和后端插入元素都可以构成一个list容器。push_back( )函数向容器后端加入元素,push_front( )函数向容器前端加入元素。
一个有序的list可以和另一个list合并,其结果是一个包含了两个原始list中所有元素的有序地list。新的list存储在调用合并函数的list中,另一个list在操作完成后为空。

 

map
map类支持关联式容器。一个值映射到唯一一个关键字。本质上这种映射就是给一个值取一个简单的名字。一个值存储到容器后,可以通过关键字查找到它。后者可以说,map就是一个成对存放关键字/值的list容器。map容器的强大之处在于,可以通过关键字来查找值。map容器中的关键字是唯一的,不可以重复使用。但可以使用multimap创建的map容器使用不唯一的关键字。
map模板定义:templat<class Key, class T, class Comp=less<Key>, class Allocator=allocator<pair<const Key, T>>> class map。其中Key是关键字的数据类型,T是map容器中存储的数据类型。Comp是比较两个关键字的函数,该函数缺省多用途函数对象是less( )。Allocator类是缺省的内存配置器。有以下几种构造函数:
explicit map(const Comp &cmpfn=Comp( ), const Allocator &a=Allocator( ));
map(const map<Key, T, Comp, Allocator> &ob);
template <class InIter> map(InIter start, InIter end, const Comp &cmpfn_Comp( ), const Allocator&a=Allocator( ));
第一种形式的构造函数构造一个空的容器;第二种形式的构造函数构造一个包含与ob元素相同的容器;第三种形式的构造函数构造一个元素范围由迭代器start和end确定的map容器,函数cmpfn如果存在,它决定容器中元素的顺序。map容器定义了如下比较运算符:==,<,<=,!=,>,>= 。
关键字/值对以pair类型的对象的形式存储在map容器中。pair类型模板定义如下:
template<class Ktype, class Vtype> struct pair{
typedef Ktype first_type;
typedef Vtype second_type;
Ktype first;
Vtype second;

pair( );
pair(const Ktype &k, const Vtype &v);
template<class A, class B> pair(const<A, B> &ob);
~pair( );
}
建包含在first中,与键关联的值包含在second中。构造一个pair对象即可以用pair的构造函数也可以用make_pair( )函数。该函数根据传入参数的类型来构造pair对象。make_pair( )函数其优点在于:存储对象的类型由编译器决定,而不需要明确指定。pair指定的数据类型必须与它要插入的map容器的相应数据类型相匹配。

原创粉丝点击