C++ STL set容器常用用法

转载 2018年04月17日 20:18:48

set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。

1.set容器的常用操作

使用时注意包含头文件<set>    std::set and std::multiset associative containers

s.begin()      返回set容器的第一个元素

s.end()      返回set容器的最后一个元素

s.clear()       删除set容器中的所有的元素

s.empty()     判断set容器是否为空

s.insert()      插入一个元素

s.erase()       删除一个元素

s.size()     返回当前set容器中的元素个数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

set模板原型://Key为元素(键值)类型

template <class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) >
  • 1

2.set容器的创建

#include <iostream>
#include <set>
#include <functional>
using namespace std;
set<int> s;

int main(){
   set<int > seta; //默认是小于比较器less<int>的set

   set<int, greater<int> > setb; //创建一个带大于比较器的set,需包含头文件functional

   int a[5] = {1,2,3,4,5};
   set<int > setc(a,a+5); //数组a初始化一个set;

   set<int > setd(setc.begin(),setc.end()); //setc初始化一个set
   //上述两例均为区间初始化

   set<int > sete(setd); //拷贝构造创建set
   return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3.set容器的增删改查

①插入

#include <iostream>
#include <set>
using namespace std;
set<int >s;
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}
int main(){
    int cnt = 1;
    s.insert(1);
    s.insert(2);
    s.insert(5);
    setprint(cnt++);

    s.insert(2); //set只允许用一个值出现一次,要插入相同元素请用multiset
    setprint(cnt++);

    int a[4] = {11,12,13,14};
    s.insert(a,a+4); //将区间[a, a+4]里的元素插入容器
    setprint(cnt++);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

插入

②删除

s.erase()       删除一个元素

s.clear()       删除set容器中的所有的元素
  • 1
  • 2
  • 3
  • 4
#include <iostream>
#include <set>
using namespace std;
set<int >s;
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}

int main(){
    int cnt = 1;
    for(int i = 1; i < 11; i++){
        s.insert(i);
    }
    setprint(cnt++);

    s.erase(9); //根据元素删除
    setprint(cnt++);

    set<int>::iterator ita = s.begin();
    set<int>::iterator itb = s.begin();
    s.erase(ita);  //删除迭代器指向位置的元素
    setprint(cnt++);

    ita = s.begin();
    itb = s.begin();
    itb++;itb++;
    s.erase(ita,itb); //删除区间[ita,itb)的元素
    setprint(cnt);
    s.clear();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

删除

③修改

不能直接修改容器内数据,所以只能删除某元素再插入要修改的数值。
  • 1
  • 2

④查找

s.find()        查找一个元素,如果容器中不存在该元素,返回值等于s.end()
  • 1
  • 2
#include <iostream>
#include <set>
using namespace std;
set<int >s;
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}
int main(){
    int cnt = 1;
    s.insert(1);
    s.insert(2);
    s.insert(5);
    setprint(cnt++);

    if(s.find(2) != s.end()) 
        cout << "2 is existent" << endl;
    else 
        cout << "2 is non-existent" << endl;
    if(s.find(3) == s.end()) 
        cout << "3 is non-existent" << endl;
    else 
        cout << "2 is existent" << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

查找


4.set的其他常用操作 

s.lower_bound() 返回第一个大于或等于给定关键值的元素

s.upper_bound() 返回第一个大于给定关键值的元素

s.equal_range() 返回一对定位器,分别表示 第一个大于或等于给定关键值的元素 和 第一个大于给定关键值
                的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于
                s.end()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
#include <iostream>
#include <set>
using namespace std;

int main(){
    set<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(5);

    cout << "lower_bound & upper_bound test:" << endl;

    cout << "第一个大于或等于3的元素: " << *s.lower_bound(3) << endl;
    cout << "第一个大于或等于2的元素: " <<*s.lower_bound(2) << endl;
    cout << "第一个大于2的元素: " <<*s.upper_bound(2) << endl;

    cout << "equal_range test:" << endl;

    cout << "第一个大于或等于2的元素: " <<  *s.equal_range(2).first << endl;
    cout << "第一个大于2的元素: " << *s.equal_range(2).second << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

样例

②判断元素是否在set中 & 判断set是否为空

#include <iostream>
#include <set>
#include <functional>
using namespace std;

int main(){
    set<int > s;
    if(s.empty()) cout << "容器为空" << endl;
    s.insert(1);
    if(!s.empty()) cout << "容器不为空" << endl;

    if(s.count(1)) cout << "1在容器中" << endl;
    if(!s.count(2)) cout << "2不在容器中" << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

是否为空

③自定义比较函数

#include <iostream>
#include <set>
#include <functional>
using namespace std;

struct cmp{
    bool operator () (const int &a, const int &b){
        return a > b;
    }
};
set<int, cmp>s; //自定义排序函数构造set
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int,cmp>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}
int main(){
    s.insert(1);
    s.insert(2);
    s.insert(6);
    setprint(1);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

自定义比较函数


以上就是刷题必备的set用法,熟练掌握,要用时别用错就成。

至于求并、交、差、对称差等操作,暂不细说,使用时要包含头文件”algorithm”。 
此外还有unordered_set和unordered_multiset,为set和multiset的无序版,使用时要包含头文件”unordered_set”。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CerberuX/article/details/51774121

C++ STL容器中erase的使用

erase()函数的功能是用来删除容器中的元素 函数原型: iterator erase(iterator where); iterator erase(iterator first,i...
  • sszgg2006
  • sszgg2006
  • 2012-04-12 14:11:05
  • 6378

c++ STL中的set容器

c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。1)...
  • huangfei711
  • huangfei711
  • 2015-08-07 10:59:50
  • 2942

C++ STL容器时间复杂度下的最佳选择

STL在C++11中还算是火热,想必大家早有耳闻,对于泛型编程而言,或者数据结构而言,STL都显得尤为重要。今天让我们来了解一下,根据时间复杂度这个条件,挑选最适合自己程序的STL。...
  • CSND_Ayo
  • CSND_Ayo
  • 2017-06-21 16:24:11
  • 2022

C++ STL基本容器的使用

C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与...
  • conanswp
  • conanswp
  • 2014-04-09 21:01:58
  • 54943

C++ STL中容器的使用全面总结

一、容器的定义        在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还...
  • u014465639
  • u014465639
  • 2017-04-19 21:44:17
  • 3388

C++STL中常用的容器下标[]运算

在C++STL中常用的容器和类型,下面哪些支持下标"[]"运算? 正确答案: A C D F I   你的答案: B H I (错误) vector list ...
  • Stand1210
  • Stand1210
  • 2016-09-09 18:27:02
  • 1239

STL常用容器对比

STL的常用容器大致有以下8个: 1.vector     vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。...
  • u011822862
  • u011822862
  • 2016-08-13 22:50:34
  • 1511

C++ STL中常见容器的时间复杂度

map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为: 插入: O(logN) 查看:O(log...
  • wusecaiyun
  • wusecaiyun
  • 2015-07-02 10:44:40
  • 6088

【C++】STL常用容器总结之一:容器与迭代器

声明: 1、本博文主要整理自《C++ Primer》和《STL源码剖析》这两本经典书籍。同时,也参考了网络中不少优秀博客,对这些博客的作者表示感谢。 2、由于博主能力有限,对于一些容器的用法可能尚...
  • hero_myself
  • hero_myself
  • 2016-08-24 22:46:00
  • 4190

C++中STL常用容器的优点和缺点

我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我...
  • aa4790139
  • aa4790139
  • 2014-03-06 11:49:06
  • 4833
收藏助手
不良信息举报
您举报文章:C++ STL set容器常用用法
举报原因:
原因补充:

(最多只允许输入30个字)