资讯专栏INFORMATION COLUMN

初探STL之关联容器

objc94 / 3349人阅读

摘要:更加实际的定义应该是一个集合是一个容器,它其中所包含的元素的值是唯一的。对而言,键只是指存储在容器中的某一成员。成员函数构造函数中的元素都是模板类对象。元素按照成员变量从小到大排列,缺省情况下用定义关键字的小于关系。

分类:set, multiset, map, multimap

特点:内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。

常用函数:

find: 查找等于某个值 的元素(x小于y和y小于x同时不成立即为相等)
lower_bound : 查找某个下界
upper_bound : 查找某个上界
equal_range : 同时查找上界和下界
count :计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等)
insert: 用以插入一个元素或一个区间

set

特点:

1.set是数学上集合的抽象,是一个不包含重复元素的集合,并且最多包含一个 null 元素。

2.set可以对序列可以进行查找,插入,删除元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,

并且当游标指向一个已删除的元素时,删除操作无效。

3.更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体

值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。

4.一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些

慢,具体实现采用了红黑树的平衡二叉树的数据结构。

成员函数

构造函数

template,

class A = allocator >

class set { … } //默认的顺序是less

01.set  s0;    
02.  
03.set  > s1;        
04.  
05.set  > s2;  
06.  
07.set  s4( s1 );  
08.  
09.set  s5( s1.begin( ), s1.begin( )+2 ); 

访问set中的元素

begin()
返回第一个元素 (不检查容器是否为空)

end()
返回最后一个元素(不检查容器是否为空)

rbegin()
返回指向集合中最后一个元素的反向迭代器

rend()
回指向集合中第一个元素的反向迭代器

find()
返回一个指向被查找到元素的迭代器

equal_range
返回集合中与给定值相等的上下限的两个迭代器

lower_bound()
返回指向大于(或等于)某值的迭代器

upper_bound()
返回大于某个值元素的迭代器

empty()
如果集合为空,返回true

clear()
清除所有元素

erase()
删除集合中的元素

insert()
在集合中插入元素

max_size()
返回集合能容纳的元素的最大限值

size()
集合中元素的数目

swap()
交换两个集合变量

count()
返回某个值元素的个数

key_comp()
返回一个用于元素间值比较的函数

value_comp()
返回一个用于比较元素间的值的函数

插入set中已有的元素时,忽略插入。

举例:
1.

01.#include   
02.#include   
03.using namespace std;  
04.  
05.int main( )  
06.{  
07.    set s1;  
08.    set::iterator siter1;  
09.  
10.    s1.insert(10);  
11.    s1.insert(20);  
12.    s1.insert(30);  
13.    s1.insert(90);  
14.    s1.insert(31);  
15.  
16.    cout<<"执行find(20)后,使用迭代器返回值是 :";  
17.    siter1=s1.find(20);  
18.    cout<<*siter1<<"
";   //20  
19.  
20.    pair::const_iterator,set::const_iterator> p1;  
21.  
22.    p1=s1.equal_range(30);  
23.    cout<<"执行equal_range(30),后返回值情况 :"<<"
";  
24.    cout<<"p1.first :";  
25.        cout<<*p1.first<<"
";  //30  
26.    cout<<"p1.second :";  
27.        cout<<*p1.second<<"
"; //31  
28.  
29.    return 0;  
30.} 

2.

01.#include "stdafx.h"  
02.#include   
03.#include   
04.using namespace std;  
05.  
06.int main()   
07.{  
08.    set s1;  
09.    set::iterator siter1;  
10.  
11.    s1.insert(10);  
12.    s1.insert(20);  
13.    s1.insert(30);  
14.    s1.insert(40);  
15.  
16.    cout<<"当值是25时  ";  
17.    cout<<"upper_bound(25)的返回值 :";  
18.    siter1=s1.upper_bound(25);  
19.    cout<<*siter1<<"  ";                    //30  
20.    cout<<"lower_bound(25)的返回值 :";  
21.    siter1=s1.lower_bound(25);              //30  
22.    cout<<*siter1<<"  ";  
23.    cout<<"
";  
24.  
25.    cout<<"当值是30时  ";  
26.    cout<<"upper_bound(30)的返回值 :";  
27.    siter1=s1.upper_bound(30);              //40  
28.    cout<<*siter1<<"  ";  
29.    cout<<"lower_bound(30)的返回值 :";  
30.    siter1=s1.lower_bound(30);  
31.    cout<<*siter1<<"  ";                    //30  
32.    cout<<"
";  
33.  
34.    getchar();  
35.    return 0;  
36.} 

multiset
特点:
1.set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。

2.删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除

3.count( a ):set能返回0或者1,multiset是有多少个返回多少个。

map
特点:
1.map提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的

值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。

2.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自

动排序的功能,所以在map内部所有的数据都是有序的。

3.映射和多重映射基于某一类型Key的键集的存在,提供对T类型的数据进行快速和高效的检索。

4.对map而言,键只是指存储在容器中的某一成员。

5.map不支持副本键,multimap支持副本键。map和multimap对象包涵了键和各个键有关的值,键和值的数据类型是不相同的,这与set不同。set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量。

成员函数
构造函数

01.template,  
02.class A = allocator >   
03.class map {   
04.    ….  
05.    typedef pair value_type;   
06.    …….  
07.};  

map 中的元素都是pair模板类对象。关键字(first成员变量)各不相同。元素按照关键字从小到大排列,缺省情况下用less,即“<” 定义“小于”。

01.map  m0;  
02.map  > m1;  
03.map  > m2;  
04.map  m4( m1 );  
05.map  m5(m1.begin( ), m1.begin( )+2);  

访问map中的元素

begin() 返回第一个元素 (不检查容器是否为空)

end() 返回最后一个元素(不检查容器是否为空)

rbegin()返回指向映射中最后一个元素的反向迭代器

rend()回指向映射中第一个元素的反向迭代器

clear()清除所有元素

count()返回某个值元素的个数

empty()如果映射为空,返回true

equal_range返回映射中与给定值相等的上下限的两个迭代器

erase()删除映射中的元素

find()返回一个指向被查找到元素的迭代器

inset()在映射中插入元素,不覆盖原元素。

key_comp()返回一个用于元素间值比较的函数

lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器

max_size()返回映射能容纳的元素的最大限值

size()映射中元素的数目

swap()交换两个映射变量

upper_bound()返回大于某个值元素的迭代器

value_comp()返回一个用于比较元素间的值的函数

[]下标

举例:

01.#include "stdafx.h"  
02.#include   
03.#include   
04.using namespace std;  
05.  
06.  
07.int main()  
08.{  
09.    map map1;  
10.  
11.    map1.insert(map::value_type(1,1.1f));  
12.    map1.insert(pair(2,2.1f));  
13.    map1[3]=3.3f;  
14.  
15.    map::iterator miter;  
16.    miter=map1.begin();  
17.  
18.    cout<<"通过(*miter)访问,begin()的返回值 :";  
19.    cout<<(*miter).first<<"   "<<(*miter).second;  
20.    cout<<"
";                                    // 1   1.1  
21.  
22.    cout<<"通过miter->访问,begin()的返回值 :";  
23.    cout<first<<"    "<second;     // 1   1.1  
24.  
25.    getchar();  
26.    return 0;  
27.}  

multimap

特点:

1.multimap中的元素由 <关键字,值>组成,每个元素是一个pair对象,关键字就是first成员变量,其类型是Key

2.multimap 中允许多个元素的关键字相同。

3.元素按照first成员变量从小到大排列,缺省情况下用 less 定义关键字的“小于”关系。

举例

01.#include "stdafx.h"  
02.#include   
03.#include   
04.using namespace std;  
05.  
06.int main(  )  
07.{  
08.    map map1;  
09.  
10.    map1.insert(map::value_type(1,1.1f));  
11.    map1.insert(pair(1,2.1f));  
12.    map1.insert(pair(2,2.1f));  
13.    map1[3]=3.3f;  
14.  
15.    cout<<"map1 :"<<"
";  
16.    map::iterator miter;  
17.    for(miter=map1.begin();miter!=map1.end();miter++)  
18.    cout<<(*miter).first<<"   "<<(*miter).second<<"
";  
19.    cout<<"
";   cout<<"
";           
20.  
21.    multimap map2;  
22.    map2.insert(map::value_type(1,1.1f));  
23.    map2.insert(pair(1,2.1f));  
24.    map2.insert(pair(2,2.1f));  
25.  
26.    cout<<"map2 :"<<"
";  
27.    multimap::iterator miter1;  
28.    for(miter1=map2.begin();miter1!=map2.end();miter1++)  
29.    cout<<(*miter1).first<<"   "<<(*miter1).second<<"
";  
30.  
31.    getchar();  
32.    return 0;  
33.}  

输出:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64117.html

相关文章

  • 初探STL容器Vector

    vector 特点: 1.可变长的动态数组 2.使用时包含头文件 #include 3.支持随机访问迭代器 • 根据下标随机访问某个元素时间为常数 • 在尾部添加速度很快 • 在中间插入慢 成员函数 初始化 [cpp] view plaincopy 01.vector(); 初始化成空 02.vector(int n); 初始...

    赵春朋 评论0 收藏0
  • 初探STL算法

    摘要:算法部分主要由头文件组成。数值算法对容器内容进行数值计算。在指定范围内查找由输入的另外一对标志的第二个序列的最后一次出现。重载函数使用自定义比较操作。删除指定范围内所有等于指定元素的元素。返回,指出序列中最小的元素。 STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。 分类 STL中算法大致分为...

    nanfeiyan 评论0 收藏0
  • STL详解(十)—— set、map、multiset、multimap的介绍及使用

    摘要:注意当中的和属于容器适配器,它们默认使用的基础容器分别是和。拷贝构造类型容器的复制品方式三使用迭代器拷贝构造某一段内容。若待插入元素的键值在当中已经存在,则函数插入失败,并返回当中键值为的元素的迭代器和。返回该迭代器位置元素的值。 ...

    不知名网友 评论0 收藏0
  • 熬夜爆肝!C++核心STL容器知识点汇总整理【3W字干货预警 建议收藏】

    摘要:拷贝构造函数示例构造无参构造函数总结容器和容器的构造方式几乎一致,灵活使用即可赋值操作功能描述给容器进行赋值函数原型重载等号操作符将区间中的数据拷贝赋值给本身。清空容器的所有数据删除区间的数据,返回下一个数据的位置。 ...

    wayneli 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<