C++容器种类

来源:互联网 发布:知水富氢果蔬消毒机 编辑:程序博客网 时间:2024/04/28 16:32

容器类型可用于创建具体对象的模板

11个容器类型分别为:deque / list / queue / priority_queue / stack / vector / map / multimap / set / mulitset / bitset

容器概念:指定了所有STL容器类都必须满足的一系列要求


容器:存储其他对象的对象

要求:1>被存储的对象必须是同一种数据类型(可以使oop意义上的对象,也可以是内置类型值)

      2>被存储在容器中的数据为容器所有,当容器过期时,存储在容器中的数据也将过期(如果数据是指针的话,它指向的数据不一定过期)

      3>被存储的类型必须是可复制构造的和可赋值的(基本类型满足这些要求,只要类定义没有将复制构造函数和赋值操作符声明为私有或保护的, 则类也满足这种要求)


序列:添加了一些要求改进了基本的容器概念(改进:概念上的继承,序列满足容器类的要求,又增加了一些要求。概念:一系列的要求)

 deque / list / queue / priority_queue / stack / vector 这6种STL容器类型都是序列

1>vector:是数组类的一种类表示

2>deque:表示双端队列,类似vector容器,主要区别在于,从deque对象的开始位置插入和删除元素的时间是固定的,不像vector那样是线性的。如果多数操作发生在序列的起始和结尾处,应考虑使用deque的数据结构。deque对象的设计比vector复杂,同样的操作,vector执行的速度更快些。

3>list:表示双向链表。list与vector的区别在于,list在链表中任意位置插入和删除的时间都是固定的。list不支持随机问 insert()和splice()之间的主要区别在于:insert()将原始区间的副本插入到目标地址,splice()则将原始区间移动到目标地址,unique()只能将相邻的相同值压缩为单个值

4>queue:是一个适配器类,队列

5>priority_queue:是另一个适配器类

6>stack:堆栈


联合容器:是对容器概念的另一个改进,联合容器将值和关键字关联在一起,使用关键字来查找值,提供了对元素的快速访问

例如:值可以是表示学生的信息(姓名、院系、专业、选课等)的数据结构

关键字可以是可唯一标识一个学生的学生学号

为了获得学生信息,程序只需使用关键字查找学生结构

联合容器允许插入元素,但不能指定插入元素的位置(位置由容器算法确定,以便能更快的查找到信息)

STL提供了4种联合容器:set / multiset /map /multimap

set:值的类型与关键字类型相同(关键字是唯一的),对set来说,值就是关键字

multiset:一个关键字对应多个值,例如:multiset对象包含的内容可以是5、5、5、5、6、6、6、7、7

map:值的类型与关键字不同,关键字是唯一的,每个关键字只对应一个值

multimap:与map类似,只是一个关键字对应多个值

/***********************************************************************************/

1>set范例

set<string,less<string>>  str;  //第1个参数指出容器存储的类型,第2个参数指示用来对关键字进行排序的比较函数或对象,默认情况下,使用less<>模板

例子:

const int N=6;

string s[N]={"buffer","thread","foreign","have","could","foreign"};

set<string> str(s,s+N);

ostream_iterator<string,char>out(cout," ");

copy(str.begin(),str.end(),out);

输出为:

buffer could foreign have thread  //输出被排序且关键字是唯一的,foreign只出现一次


2>multimap范例

multimap关键字的类型与值类型不同,特定的关键字可对应多个值

例:multimap<int,string> code

为将信息结合在一起,实际的值类型=关键字类型+数据类型

STL使用pair<class T,class U>模板类将这两个值存储到一个对象中

例如:keytype是关键字类型,datatype是数据类型,则值类型为pair<const keytype,datatype>

假设要将区号作为关键字存储城市名,将关键字声明为int,数据类型声明为string

方法1:创建一个pair,然后将它插入

pair<const int ,string>item(222,"Nan jing");

code.insert(item);

方法2:创建一个匿名pair对象

code.insert(pair<const int,string>(222,"Nan jing"));


有了pair后,可以使用first和second成员来访问其两部分

cout<<item.first<<" "<<item.second<<" ";


equal_range()用关键字作参数,返回与关键字匹配的迭代器区间,为返回两个值,该方法将这两个值封装在一个pair对象中

此时两个模板参数是迭代器类型

pair<multimap<int,string>::iterator,multimap<int,string>::itertor> range=code.equal_range(718);






原创粉丝点击