• stl学习(二)集合 set 的使用


    • set集合容器底层由红黑树实现,是平衡二叉搜索树。
    • 相对stl中的list、deque效率更高。
    • 注意:由于集合 的 性质,单纯的 set 不允许重复的元素
    • 初始化 / 清空 函数 : clear()
    • 插入 / 添加 函数:insert(x) (插入键值x到集合中)
    • 插入 / 添加 函数:insert(iterator,iterator) (插入迭代器之间的元素到集合中)
    • 检索 / 查找 函数:find(x) (查找键值为x的元素,若存在,则返回键值的迭代器位置,否则返回集合最后一个元素的下一个位置)
    • 删除 函数:erase(x) (删除键值为x的元素)
    • 删除 函数:erase(iterator) (删除迭代器位置的元素)
    • 删除 函数:erase(iterator,iterator) (删除迭代器之间的值)
    • 累计 函数:count(x)(用来查找集合中某个元素是否出现过,只返回1或0)
    • 类似二分查找 函数:equal_range(x)(返回第一个大于或等于键值的迭代器 和 第一个大于键值的迭代器)
    #include <set>
    #include <iterator>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef set<int> S;
    S s;
    int n;
    
    int main()
    {
    	cin>> n;
    	for( int i = 0 ; i < n ; i++ ){
    		int x;
    		cin>> x;
    		s.insert( x );
    	}
    	pair< S::const_iterator,S::const_iterator > pr;
    	int y;
    	cin>> y;
    	pr = s.equal_range( y );
    	cout<< *pr.first << *pr.second <<endl;
    	return 0;
    }
    怎样更加灵活地使用set?
    》》》
    1.灵活使用关键字排序
    ※若集合元素不是结构体是单纯的变量类型,用结构体重载()运算符
    #include <set>
    #include <vector>
    #include <iterator>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    struct cmp{
    	bool operator () ( const int &a,const int &b ){
    		return a>b;
    	}
    };
    typedef set<int,cmp> S;
    int n;
    S s;
    
    int main()
    {
    	cin>> n;
    	for( int i = 0 ; i < n ; i++ ){
    		int x;
    		cin>> x;
    		s.insert( x );
    	}
    	for( S::iterator i = s.begin() ; i != s.end() ; i++ )
    		cout<< *i <<endl;
    	return 0;
    }
    ※若集合元素为结构体,直接在元素结构体内重载 < 运算符即可
    2.灵活使用遍历
    顺序遍历,使用iterator直接遍历即可
    set<int> s ;
    for( set<int>::iterator i = s.begin() ; i != s.end() ; i++ );
    
    ※反序遍历,使用reverse_iterator
    set<int> s ;
    for( set<int>::reverse_iterator i = s.rbegin() ; i != s.rend() ; i++ )
    • set的遍历是高效的中序遍历,也就是说iterator的++和--就可以直接得到其前驱和后继

  • 相关阅读:
    安装Eclipse for MAC 苹果版
    visual studio code emmet 插件不提示?解决方案
    支付宝付款页面调整屏幕亮度
    浅谈iOS需要掌握的技术点
    Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
    ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(-)
    ios 添加到cell 上的button点击无效!扩大button的点击区域(黑魔法)
    个人中心模块-拍照剪裁上传
    利用js与java交互
    显示gif动画(帧动画的播放)
  • 原文地址:https://www.cnblogs.com/keshuqi/p/5957686.html
Copyright © 2020-2023  润新知