STL—set(一)

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

文章目录

一、什么是set

二、set的操作

1.set的定义

2.set内元素的访问

3.set中的函数

(1)insert()

(2)find()

(3)erase()

删除单个元素

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

(4)size()

(5)clear()


一、什么是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

目录
相关文章
|
存储 编译器 程序员
用同一棵红黑树实现map和set【STL】
用同一棵红黑树实现map和set【STL】
58 0
|
存储 C++ 容器
map、set、multimap和multiset的使用【STL】
map、set、multimap和multiset的使用【STL】
49 0
|
9月前
|
C++ 容器
【C++】红黑树模拟实现STL中的map与set
【C++】红黑树模拟实现STL中的map与set
|
8月前
|
存储 编译器 C++
|
7月前
|
存储 算法 C++
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
94 0
|
9月前
|
存储 C++ 容器
C++:STL - set & map
C++:STL - set & map
73 4
|
9月前
|
存储 Serverless C++
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
109 1
|
算法 Serverless C++
用同一个哈希表实现unordered_map和unordered_set(C++实现)【STL】
用同一个哈希表实现unordered_map和unordered_set(C++实现)【STL】
36 0
|
9月前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
9月前
|
C++ 容器
黑马c++ STL部分 笔记(8) set/ multiset 容器
黑马c++ STL部分 笔记(8) set/ multiset 容器