EchoDemo's Blogs

C++中的set

在编程过程中,有时经常出现去掉重复元素的情况,而且有可能因为这些元素比较大或者类型不是int型而不能直接开散列表。此时我们应当想到set,set是关联式容器。其作为一个容器是用来存储同一类型数据的数据类型,比如:int、char、double、结构体等。在set中每个元素的值都唯一,而且系统能根据元素的值自动进行递增排序,这是因为其内部是用红黑树实现的。如果需要使用set,必须包含头文件#include还有命名空间”using namespace std;”。

1、set的定义:set<typename> name;例如:

set<int> name;      //声明一个int容器
set<int> name(10);  //声明一个初始大小为10的int型容器
set<int> name(10,1);//声明一个初始大小为10且初始值都为1的int型容器
set<int> name(a);   //声明一个初始大小为a的int型容器
set<node> name;     //node是结构体的类型

如果typename是set,定义的时候记得在>>符号之间加上空格:
set<set<int> > name;//>>之间要有空格

2、set数组的定义:set<typename> arrayname[arraysize];例如:

set<int> a[100];//a[0]~a[99]中的每一个都是一个set容器

与set<set<int> > name;不同的是,这种写法的一维长度已经固定为arraysize,另一维才是变长的。

3、set容器内元素的访问

set只能通过迭代器访问,迭代器可以理解为一种类似指针的东西,其定义是:set<typename>::iterator it;这样得到迭代器it之后,就可以通过*it来访问set中的元素例如:

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

int main(){
    set<int> a;
    a.insert(3);//将3插入set中
    a.insert(5);
    a.insert(2);
    a.insert(3);
    for(set<int>::iterator it=a.begin();it!=a.end();it++){//a.begin()为取a的首元素地址,而it指向这个地址
        cout<<*it;
    }
    return 0;
}

上述程序中出现了去a的首地址的begin()函数,那么就不得不提到end()函数。与begin()函数不同的是,end()函数作为迭代器的末尾标志,取的是尾元素地址的下一个地址,不存储任何元素。
另外,set的迭代器不支持it<a.end()的写法,因此循环条件只能用it!=a.end()。除此之外,迭代器还实现了两种自加操作:it++和++it(自减操作同理)。另外,除vector和string之外的STL容器都不支持*(it+i)的访问方式。因此只能按如上的方式枚举。

4、set常用的函数

(1)insert(x):在set容器中添加一个元素,并自动递增排序,时间复杂度为O(logN),N为set内元素个数。
(2)find(x):用以返回set中对应值为x的迭代器,时间复杂度为O(logN)。set<int>::iterator it=a.find(2)
(3)size():用来获得set中的元素的个数,时间复杂度为O(1)。
(4)clear():用来清空set中的所有元素,时间复杂度为O(N)。
(5)erase():有两种用法:删除单个元素,删除一个区间内的所有元素。删除单个元素有两种用法:a.erase(it),it为所需要删除元素的迭代器,时间复杂度O(1);a.erase(x),x为所要删除元素的值,时间复杂度为O(logN)。删除一个区间内的所有元素:a.erase(first,last),first为起始迭代器,而last为删除区间的末尾迭代器的下一个地址。
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------