c++ STL 之集合—— set 详解

set是 stl 的一个关联容器,名叫“集合”,何为“集合”?其实就是一个数组,但有了数组何必还需集合,这是一个高深的问题。

目录

一、简介

        1.空间复杂度

        2. 与 vector 相比

                优点:

                缺点:

                综合:

二、 set 用法

        1.声明 set 

        2.新增“元素”

三、map 遍历

         1.使用 “iterator”

         2.使用 “auto”

四、关于 set 的函数

        1.find

        2.clear

         3.erase

        4.empty

        5.swap

        6.count

一、简介

        1.空间复杂度

    map 类似于 vector,可以随时创建新的元素,避免浪费过多空间,具体实现如下:

pair<iterator,bool> insert(const value_type& __v)
        {return __tree_.__insert_unique(__v);}

        2. 与 vector 相比

                优点:

           set 可以直接查找值,只需要 O(log n) 的时间复杂度,而 vector 不但需要手写查找函数,时间复杂度还达到了 O(n)。

                缺点:

           vector 更类似数组,因此按下表访问时只需要 O(1) 的时间复杂度,而 set 根本没有下标,只能按值搜索。

                综合:

           set 适合用作桶,非常节省空间。vector则用作数组,它可以说与数组比较是只有优点,没有缺点。可见各有各的优点和缺点。

二、 set 用法

        1.声明 set 

    首先需要引用 “set” 头文件,如下:  

#include <set>

     声明时和一般模版类的声明方式一样,先注明类型(即 set )再填写模版,最后为变量名。例如:

set <int> s;


        2.新增“元素”

    我们可以使用 “insert” 函数,如下: 

s.insert(1);

三、map 遍历

         1.使用 “iterator”

     “iterator” 中文名为“迭代器”,访问方式如下:

for(set <int>::iterator it = s.begin();it != s.end();++ it)
{
    cout << *it;
}

    由于 it 是一个指针所以需要加 “*” 访问。

         2.使用 “auto”

    c++11 以后,新增了一种 for 循环语法(如下), vector、list 等容器也可以这么访问。

for (auto i : v)
{
        
}

四、关于 set 的函数

        1.find

     查找 x 在 set 中的位置,若不存在这个键返回 “s.end()”,各自返回指针,如下:

cout << s.find(x);

        2.clear

    清空 set,vector 等容器也有这个函数,如下:

s.clear();


         3.erase

   清除一个元素,或从 “begin” 到 “end” 的所有元素,注意参数需为指针,如下

s.eraser(s.find(x));
s.eraser(begin,end);

若在循环中,需要更新迭代器: 

for (set<int>::iterator it = s.begin();it != s.end();++ it);
	it = s.erase(it);
}


        4.empty

    查看 set 是否为空,如下:

if(s.empty()) cout << "Yes";


        5.swap

    交换两个 set,如下:

s.swap(temp);


        6.count 

    查找 x 在 set 中出现了几次,由于 set 不允许相同元素出现,所以返回值非 0 即 1,如下:

cout << s.count(x);

你学会了吗?

  • 49
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值