STL学习:set

来源:互联网 发布:智联招聘java简历模板 编辑:程序博客网 时间:2024/05/29 09:09

Set集合容器,是一种实现了平衡二叉树的数据结构,容器中的数据不能重复,即每个数据都是唯一的,而且容器中的数据页数不能直接修改的,因为修改后的数据很可能不在原来的数位上。Set容器的主要目的是快速检索数据元素,减速时采用中序遍历,可将容器内数据由小到大遍历处理。需要注意的是,关联容器的迭代器不支持it+n操作,仅支持it++

Set容器的定义和使用方法如下:

(一)Set容器的定义:

set<类型对象名如:set<int> s;  

set<类型,比较结构体对象名如:set<intmyComp> s; Set容器在插入时,默认情况下按从小到大的顺序存储,可以通过自定义比较结构体,按从大到小的顺序存储或者按照多个关键字序列插入。

(二)添加元素:

set<int> s;

s.insert(8);

s.insert(10);

s.insert(6);

s.insert(8); 重复元素不会插入

(三)遍历访问:

1)顺序遍历:

set<int> s;

set<int>::iterator it;

for(it=s.begin();it!=s.end();s++)

*it;

2)反序遍历:

set<int>::reverse_iterator it;

for(it=s.rbegin();it!=s.rend();s++)

*it;

(四)删除元素:

erase(迭代器)

erase(元素值)

erase(迭代器1,迭代器2)

clear(),清空容器,相当于删除所有的元素。

(五)查找元素:

find (元素),返回一个迭代器值。查找结果:找到了,返回指向该元素的迭代器;没找到,返回s.end();

(六)自定义比较函数:

1)当set中存储的数据,需要按自定义的规则进行比较大小时;

2)当set中存储的是自定义数据时,如结构体,类等。

第一种情况,元素类型不是结构体。

首先,定义比较结构体

struct myComp

{

bool operator() (const 类型 &a, const 类型 &b)

   {

……returna>b;

}

};

然后,定义set

set<类型,myComp> s

 

第二种情况,元素类型是结构体。

首先,在结构体中,增加“operator <”函数

struct 结构体

{

bool operator < (const 结构体类型 &a)

   {

……return(…);

}

};

然后,定义set

set<类型> s


[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<set>  
  3. #include<string>  
  4. using namespace std;  
  5. typedef struct non  
  6. {  
  7.     string name;  
  8.     float score;  
  9.     bool operator<(const non &a) const  
  10.     {  
  11.         return a.score<score;  
  12.     }  
  13. } STU;  
  14.   
  15. int main()  
  16. {  
  17.     set<STU> v;  
  18.     STU s;  
  19.     s.name="Jack";  
  20.     s.score=80.5;  
  21.     v.insert(s);  
  22.     s.name="Nacy";  
  23.     s.score=60.5;  
  24.     v.insert(s);  
  25.     s.name="Tomi";  
  26.     s.score=20;  
  27.     v.insert(s);  
  28.     set<STU>::iterator p;  
  29.     for(p=v.begin(); p!=v.end(); p++)  
  30.     {  
  31.         cout<<(*p).name<<" : "<<(*p).score<<endl;  
  32.     }  
  33.     return 0;  
  34. }  
  35. 输出结果:  
  36. Jack : 80.5  
  37. Nacy : 60.5  
  38. Tomi : 20  
#include <cstdio>#include <iostream>#include <algorithm>#include <set>#include <string>using namespace std;int main (){set<int>a;a.insert(1);a.insert(2);a.insert(4);a.insert(3);cout<<a.size()<<endl;set<int>::iterator i,j;int k=0;for(k=0,i=a.end();k<a.size();k++){cout<<*(--i)<<endl;}for(i=a.begin();i!=a.end();i++){cout<<*i<<endl;}a.clear();a.insert(1);a.insert(3);i=a.find(3);a.insert(1);a.insert(3);//cout<<i-a.begin()<<endl;    a.erase(3);cout<<a.count(3)<<endl;if(*a.find(2)==2)cout<<'-'<<endl;return 0;}


0 0