关联式容器set

set

set 可以理解为我们数学中的集合,它可以包含 0 个或多个不重复的数据。map 也是一种集合,它同样可以包含多个元素,每一个元素由一个键值和一个与键值相关联的值组合而成,这样的元素又称键值对(<key, value>)。

map 容器会根据各个元素的键的大小,对所有的元素进行排序,默认会进行升序排序;set 容器也会自行根据各个数据的值的大小进行排序,默认也是升序排序。

在 map 中,各个元素的键是不允许重复的。而 multismap 则允许有多个相同键的键值对。可以这样理解,multimap 是允许有重复键的 map。multiset 和 set 之间的区别,和 multimap 与 map 的区别完全一样。因为 multiset 和 multimap 可以看做是 set 和 map 的扩展,因此我们将主要介绍 set 和 map。

example

#include <iostream>
#include <set>

using namespace std;

void print(set<int> &s)
{
    set< int >::const_iterator itor;

    for(itor = s.begin (); itor != s.end(); itor++)
        cout<< *itor<<" ";
    cout<< endl;

    itor = s.find(2);
    cout<< "s.find(2) *itor = " <<*itor << endl ;
    if(itor == s.end())
    {
        cout <<"find 2" <<endl;
    }
    else
    {
        cout << "not find 2" <<endl;
    }

    itor = s.end();
    cout<< "s.end() *itor = " <<*itor << endl ;

    itor = s.find(10);
    cout<< "s.find(5) *itor=" << *itor << endl ;
    if(itor == s.end())
    {
        cout <<"find 5" <<endl;
    }
    else
    {
        cout << "not find 5" <<endl;
    }
    itor = s.end();
    cout<< "s.end() *itor = " <<*itor << endl ;

}

int main()
{
    set< int > s;
    s.insert(s.begin(), 1);
    s.insert(2);
    s.insert(s.end(),3);
    s.insert(4);
    s.insert(5);
    //s.insert(1);
    s.insert(6);
    s.insert(7);
    s.insert(8);
    s.insert(9);
    //s.insert(11);
    //s.insert(1);

    print(s);

    return 0;
}

在这里插入图片描述
本例是 set 的一个示例,在主函数中我们先创建了一个 set 容器整型的示例 s,之后就开始向容器中添加数据。对于 set 容器,insert() 被重载过,其调用方式有两种,我们既可以向前面序列式容器那样调用:

s.insert(s.begin(), 9);
s.insert(s.end(), 5);

直接插入元素:

s.insert(6);

但是无论以哪种方式进行调用,insert() 函数都能保证插入元素后 set 容器中不会出现重复的元素。在插入一些元素之后,我们就定义了一个迭代器 itor 用于访问容器中的元素。访问的方法和序列式容器相同。

find() 函数可以用于查找 set 容器中是否包含指定的键值,如果存在,则返回指向该键值的迭代器,如果不存在,则返回与 end() 函数相同的结果。在例 1 中,我们分别查找了键值 2 和 5 是否存在于集合 s 中,因为 s 容器没有元素 2,因此返回值等于 s.end();而 s 容器中存在元素 5,因此查找时函数的返回结果不等于 s.end()。

小结

set 和 map 每一个元素由一个键值和一个与键值相关联的值组合而成,这样的元素又称键值对(<key, value>)

reference

微学苑 C++ set

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静思心远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值