STL之 set的用法

20 篇文章 0 订阅

Map,Set属于标准关联容器,使用了非常高效的平衡检索二叉树:红黑树,他的插入删除效率比其他序列容器高是因为不需要做内存拷贝和内存移动,而直接替换指向节点的指针即可,所以两者之间的一些用法是类似的。

set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

同样的在map中也有这个特点。转载的这篇文章举例了一些用法,特别好。点击打开链接

set的各成员函数列表如下:

c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器

c++ stl容器set成员函数:clear()--清除所有元素

c++ stl容器set成员函数:count()--返回某个值元素的个数

c++ stl容器set成员函数:empty()--如果集合为空,返回true

c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器

c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器//可用来判断set中是否含有某个元素,与map类似

c++ stl容器set成员函数:erase()--删除集合中的元素

c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器

c++ stl容器set成员函数:get_allocator()--返回集合的分配器

c++ stl容器set成员函数:insert()--在集合中插入元素

c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数

c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值

c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器

c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器

c++ stl容器set成员函数:size()--集合中元素的数目

c++ stl容器set成员函数:swap()--交换两个集合变量

c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器

c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数


常用操作:
1.元素遍历

#include<bits/stdc++.h>
using namespace std;
int main()
{
    set<int> s;
    s.insert(8);  //第一次插入8,可以插入
    s.insert(1);
    s.insert(12);
    s.insert(6);
    s.insert(8);   //第二次插入8,重复元素,不会插入
    set<int>::iterator it; //定义前向迭代器
    //中序遍历集合中的所有元素
    for(it=s.begin();it!=s.end();it++)
    cout<<*it<<' ';
    cout<<endl;
    set<int>::reverse_iterator ri;//反向遍历,在c++11中可以更方便的使用auto,但是有的编译器还不支持
    for(ri=s.rbegin();ri!=s.rend();ri++)
        cout<<*ri<<' ';
        cout<<endl;
    return 0;
}
输出:

1 6 8 12
12 8 6 1

2.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
       

set<int> s;          
s.erase(2);        //删除键值为2的元素          
s.clear();
3.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
set<int> s;            
set<int>::iterator it;            
it=s.find(5);    //查找键值为5的元素  
if(it!=s.end())    //找到                
  cout<<*it<<endl;            
else            //未找到                
  cout<<"未找到";
4.自定义比较函数
set集合默认函数使得插入数据按升序排列,但有时你需要自定义函数改变set数据排列
 (1)元素不是结构体:
  例:

#include<bits/stdc++.h>
using namespace std;
//自定义比较函数myComp,重载“()”操作符
struct myComp
{
    bool operator()(const int &a,const int &b)
    {
         return a>b;
    }
};       
int main()
{
    set<int,myComp> s;//按照myComp规则排序
    s.insert(8);  //第一次插入8,可以插入
    s.insert(1);
    s.insert(12);
    s.insert(6);
    s.insert(8);   //第二次插入8,重复元素,不会插入
    set<int>::iterator it; //定义前向迭代器
    //中序遍历集合中的所有元素
    for(it=s.begin();it!=s.end();it++)
    cout<<*it<<' ';
    cout<<endl;
    return 0;
}

//输出:12 8 6 1</span>     
 (2)如果元素是结构体,可以直接将比较函数写在结构体内。


struct Info        
  {           
	 string name;            
	float score;            
	//重载“<”操作符,自定义排序规则            
	bool operator < (const Info &a) const            
	{                
		//按score从大到小排列                
		return a.score<score;            
	}        
  };       
   set<Info> s;       
   ......//插入输出就不写了,
还有一种是 仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明

#include<bits/stdc++.h>
using namespace std;
struct point
{
    int x,y;
};
class sortpoint
{
public:
    bool operator()(const point &a,const point &b)const
    {
        if(a.x==b.x){
            return a.y>b.y;
        }
        return a.x>b.x;
    }
};
int main()
{
    set<point,sortpoint> pointset;
    point p1,p2,p3;
    p1.x=1,p1.y=2;
    p2.x=1,p2.y=3;
    p3.x=2,p3.y=2;
    pointset.insert(p1);
    pointset.insert(p2);
    pointset.insert(p3);
    for(set<point>::iterator it=pointset.begin();it!=pointset.end();it++){
        cout<<it->x<<' '<<it->y<<endl;
    }
    return 0;
}
输出:

2 2

1 3

1 2

注意:
map和set的函数和用法是极其相似的,Set和Vector的区别在于Set不包含重复的数据。Set和Map的区别在于Set只含有Key,而Map有一个Key和Key所对应的Value两个元素。
只需熟练掌握其中一种,另一种稍加变通就OK了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ STLset是一个集合容器,其元素是唯一的,即相同的元素只会出现一次。set是按照一定的顺序排列的,通常默认情况下是升序排列。set可以进行快速的查找、插入和删除操作,时间复杂度为O(log n)。 以下是set的常用操作: 1. 插入元素:使用insert()函数,可以插入单个元素或一组元素。 2. 删除元素:使用erase()函数,可以删除单个元素、指定位置的元素或一个范围内的元素。 3. 查找元素:使用find()函数,可以查找指定元素是否存在于set。 4. 获取set元素个数:使用size()函数。 5. 判断set是否为空:使用empty()函数。 以下是一些set的常见用法: ``` #include <iostream> #include <set> using namespace std; int main() { // 创建一个set set<int> mySet; // 插入元素 mySet.insert(3); mySet.insert(1); mySet.insert(4); mySet.insert(2); mySet.insert(5); // 遍历set的所有元素 for (auto it = mySet.begin(); it != mySet.end(); it++) { cout << *it << " "; } cout << endl; // 查找元素 if (mySet.find(4) != mySet.end()) { cout << "4 is found." << endl; } else { cout << "4 is not found." << endl; } // 删除元素 mySet.erase(4); // 遍历set的所有元素 for (auto it = mySet.begin(); it != mySet.end(); it++) { cout << *it << " "; } cout << endl; // 获取set元素个数 cout << "The size of set is " << mySet.size() << endl; // 判断set是否为空 if (mySet.empty()) { cout << "The set is empty." << endl; } else { cout << "The set is not empty." << endl; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值