STL—set

举报
辰chen 发表于 2022/06/14 23:05:16 2022/06/14
1k+ 0 0
【摘要】 文章目录 一、什么是set二、set的操作1.set的定义2.set内元素的访问3.set中的函数(1)insert()(2)find()(3)erase()删除单个元素删除一个区间内的所有元素 ...


一、什么是set

set意为集合,是一个内部自动有序,并且不含重复元素的容器,有些题目可能会要求去重操作,这时候就可以用set去解决,并且set可以实现自动排序,熟练的使用set之后可以减少某些题目的思维量,如果要使用set,需要添加头文件#include <set>


二、set的操作

1.set的定义

set<typename> name;

  
 

我们发现它的定义方法其实和vector十分类似,或者说大部分的STL容器都是如此的定义方法,这里的typename可以使任何的基本类型,例如int, char, double,结构体,当然也可以是其他的STL中的容器,如vector, set, queue

set<int> a;
set<double> b;
set<char> c;
set<vector<int>> s; //这里如果报错的话,写成如下样子:
set<vector<int> > s;
//报错原因是C++11以前的编译器会把这个翻译成移位操作

  
 

2.set内元素的访问

set只能通过迭代器(iterator)访问

set<typename>::iterator it;

  
 

迭代器的遍历方法和vector中一致,不清楚的读者可以去看:STL—vector

这样it就是vector<typename>::iterator类型的变量,typename就是定义set时候的类型,当然it也可以写成t或者其他的样子,这里写成it是习惯,有了it这个迭代器,我们就可以通过*it来访问set中的元素,下面我们距离来说明:
s.insert(x)是把x插入到set中,下文会做讲解
s.begin()是v的首元素地址
s.end()是取v的尾元素地址的下一个地址

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(2);
    s.insert(-3);
    s.insert(7);
    s.insert(2);
    s.insert(4);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ ) 
        cout << *it << ' ';
    
    return 0;
}

  
 

当然我们可以通过auto缩写

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(2);
    s.insert(-3);
    s.insert(7);
    s.insert(2);
    s.insert(4);
    
    for (auto it = s.begin(); it != s.end(); it ++ ) 
        cout << *it << ' ';
    
    return 0;
}

  
 

输出结果为:-3 2 4 7
可以发现,set内的元素自动单调递增且去重

3.set中的函数

(1)insert()

s.insert(x);可以把x插入到set容器中,并且自动递增排序并且去重,时间复杂度为O(logN),其中N为set内的元素个数

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(2);
    s.insert(-3);
    s.insert(7);
    s.insert(2);
    s.insert(4);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ ) 
        cout << *it << ' ';
    
    return 0;
}

  
 

输出结果为:-3 2 4 7

(2)find()

s.find(value);返回set中对应值为value的迭代器,时间复杂度是O(logN),N为set内的元素个数

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    for (int i = 1; i <= 5; i ++ ) s.insert(i);
    
    set<int>::iterator it = s.find(3);
    cout << *it;
    
    return 0;
}

  
 

输出结果为:3
当然也可以简写成:

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    for (int i = 1; i <= 5; i ++ ) s.insert(i);
    
    cout << *(s.find(3));
    
    return 0;
}

  
 

(3)erase()

删除单个元素

s.erase(it);it为所需要删除元素的迭代器,时间复杂度为O(1),可以结合find()去使用

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    for (int i = 1; i <= 5; i ++ ) s.insert(i);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
        cout << *it << ' ';
    cout << endl;
    
    s.erase(s.find(3));
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
        cout << *it << ' ';
    
    return 0;
}

  
 

输出结果为:
1 2 3 4 5
1 2 4 5

s.erase(value);value为所需要删除元素的值,时间复杂度为O(logN),N为set内的元素个数

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    for (int i = 1; i <= 5; i ++ ) s.insert(i);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
        cout << *it << ' ';
    cout << endl;
    
    s.erase(3);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
        cout << *it << ' ';
    
    return 0;
}

  
 

输出结果为:
1 2 3 4 5
1 2 4 5

删除一个区间内的所有元素

s.erase(first, last);可以删除一个区间内的所有元素,其中农first是所需要删除区间的起始迭代器,而last为所需要删除区间的末尾迭代器的下一个地址,即删除[first, last),时间复杂度为O(last - first)

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(2);
    s.insert(-3);
    s.insert(7);
    s.insert(2);
    s.insert(4);
    s.insert(-10);
    
    s.erase(s.find(-3), s.find(4));
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ ) 
        cout << *it << ' ';
    
    return 0;
}

  
 

输出结果为:-10 4 7

(4)size()

s.size();用来获得set内元素的个数,时间复杂度为O(1)

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(2);
    s.insert(-3);
    s.insert(7);
    s.insert(2);
    s.insert(4);
    s.insert(-10);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ ) 
        cout << *it << ' ';
    cout << endl;
    
    cout << s.size();
    
    return 0;
}

  
 

输出结果为:
-10 -3 2 4 7
5

(5)clear()

s.clear();用来清空set内的所有元素,时间复杂度为O(N),N为set内元素的个数

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(2);
    s.insert(-3);
    s.insert(7);
    s.insert(2);
    s.insert(4);
    s.insert(-10);
    
    for (set<int>::iterator it = s.begin(); it != s.end(); it ++ ) 
        cout << *it << ' ';
    cout << endl;
    
    s.clear();
    
    cout << s.size();
    
    return 0;
}

  
 

输出结果为:
10 -3 2 4 7
0

文章来源: chen-ac.blog.csdn.net,作者:辰chen,版权归原作者所有,如需转载,请联系作者。

原文链接:chen-ac.blog.csdn.net/article/details/116382154

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。