C++ STL排序关联式容器 (二)map / set

一、C++容器分类

C++容器可分为序列式容器和关联式容器两大类,序列式容器包括 array、vector、list(双向链表)、deque(双端队列) 和 forward_list,关联式容器又分为排序关联式容器和无序关联式容器
换句话说STL 提供有 3 类标准容器,分别是序列容器、排序容器和哈希容器,其中后两类容器有时也统称为关联容器

关联式容器存储的是**“键值对”**形式的数据

在这里插入图片描述
在这里插入图片描述

二、键值对pair类

头文件<utility>
提供创建 pair 对象的方法之外,还为 pair 对象重载了 <、<=、>、>=、==、!= 这 6 的运算符,对于进行比较的 2 个 pair 对象,先比较 pair.first 元素的大小,如果相等则继续比较 pair.second 元素的大小,对于进行比较的 2 个 pair 对象,其对应的键和值的类型比较相同,否则将没有可比性
swap()互换 2 个 pair 对象的键值对,前提是这 2 个 pair 对象的键和值的类型要相同

pair1.swap(pair2)
make_pair(key,value)

三、map 、set

<map> 头文件中,并位于 std 命名空间

作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。
map 容器按照既定的规则自动根据各键值对的键的大小做升序排序。默认情况下选用std::less排序规则(其中 T 表示键的数据类型)也可以自定义排序规则
map 容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。
在这里插入图片描述
multimap 和 map 容器的区别在于,容器中可以同时存储多(≥2)个键相同的键值对

set仍然是以键值对存储数据,它和map的唯一的区别在于set只能存key和value的值相等的键值对为了节约空间当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可使用 set 容器存储的各个元素的值必须各不相同

set 详解

和 map 容器不同 C++ STL 中的 set 容器类模板中未提供 at() 成员函数,也未对 [] 运算符进行重载。因此,要想访问 set 容器中存储的元素,只能借助 set 容器的迭代器。

值得一提的是,C++ STL 标准库为 set 容器配置的迭代器类型为双向迭代器。这意味着,假设 p 为此类型的迭代器,则其 只能进行 ++p、p++、–p、p–、*p 操作并且 2 个双向迭代器之间做比较也只能使用 == 或者 != 运算符

创建并初始化set容器
    std::set<std::string> myset{ "http://c.biancheng.net/java/",
                                 "http://c.biancheng.net/stl/",
                                 "http://c.biancheng.net/python/"
    };
    
利用双向迭代器,遍历myset  不再像map一样iter还有first和second两个域 直接*iter访问数据
因为 iter 迭代器指向的是 set 容器存储的某个元素而不是键值对
因此通过 *iter 可以直接获取该迭代器指向的元素的值。
    for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
        cout << *iter << endl;
    }

set insert 的四种方法

1、
//普通引用方式传参
pair<iterator,bool> insert (const value_type & val);
//右值引用方式传参
pair<iterator,bool> insert (value_type && val);
返回的都是 pair 类型的值,其包含 2 个数据,一个迭代器和一个 bool 值:
当向 set 容器添加元素成功时,该迭代器指向 set 容器新添加的元素,bool 类型的值为 true;
如果添加失败,即证明原 set 容器中已存有相同的元素,此时返回的迭代器就指向容器中相同的此元素,同时 bool 类型的值为 false。
左值引用、右值引用详解http://c.biancheng.net/view/439.html

2、
//以普通引用的方式传递 val 值
iterator insert (const_iterator position, const value_type & val);
//以右值引用的方式传递 val 值
iterator insert (const_iterator position, value_type && val);
使用 insert() 方法将目标元素插入到 set 容器指定位置后,如果该元素破坏了容器内部的有序状态,set 容器还会自行对新元素的位置做进一步调整。也就是说,insert() 方法中指定新元素插入的位置,并不一定就是该元素最终所处的位置。
当向 set 容器添加元素成功时,该迭代器指向容器中新添加的元素;
当添加失败时,证明原 set 容器中已有相同的元素,该迭代器就指向 set 容器中相同的这个元素

3、
void insert (InputIterator first, InputIterator last);
向当前 set 容器中插入其它 set 容器指定区域内的所有元素,只要这 2 个 set 容器存储的元素类型相同 半闭半开 [ first, last)

4、
void insert ( {E1, E2,…,En} ); 一次添加多个元素

set三种删除方法

//删除 set 容器中值为 val 的元素
size_type erase (const value_type& val);
//删除 position 迭代器指向的元素
iterator erase (const_iterator position);
//删除 [first,last) 区间内的所有元素
iterator erase (const_iterator first, const_iterator last);

关联式容器map的使用方法和无序关联式容器unordered_map完全一样 传送门
(https://blog.csdn.net/Wjf7496/article/details/108987535)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值