【C++】关联式容器——map&set的使用(中)

简介: 【C++】关联式容器——map&set的使用(中)

3. 迭代器

2bdb5fda44346bb71ad8a249cdb3f930.png

set迭代器的使用与其他容器的迭代器一样

void Test2()
{
    vector<int> v = {1,3,5,2,6,3,5,1};
    set<int> s(v.begin(), v.end());//使用set存放之后可以去重
    set<int>::iterator it1 = s.begin();
    cout << "正向迭代器:";
    while(it1 != s.end())
    {
        cout <<*it1 << " ";
        ++it1;
    }
    cout << endl;
    set<int>::reverse_iterator it2 = s.rbegin();
    cout << "反向迭代器:";
    while (it2 != s.rend())
    {
        cout << *it2 << " ";
        ++it2;
    }
    cout << endl;
}


6d4f249f7e4dab25e25362aa503499ff.png

4.容量相关操作

函数原型 说明
bool empty() const; 判断set是否为空,如果为空返回true,否则返回flase
size_t size() const; 返回容器的数据个数,类型为size_t(unsigned int)
size_t max_size() const; 返回容器中最多能够存放的数据个数


5.modify

1.insert

向set中插入一个对象,并且能够保持结构不变,依然符合平衡搜索树

79a98e8ac9a79c9d7638d7606a67fab7.png

这里注意一下:第一个插入返回的是一个pair类型的对象,其中pair的第一个成员是一个迭代器,其指向的是插入的元素在set中的位置,第二个成员是bool类型,如果成功插入了数据就返回true,若set中已经存在这个数据,就会插入失败,其中的值就是false。


所以这里insert能够做到两个功能:查找和插入。


2.erase

在set中删除一个数据,并且结构保持不变

b8ad5df68d355e84db2a6ed011191d54.png

void Test3()
{
    vector<int> v = {1,3,5,2,6,3,5,1};
    set<int> s(v.begin(), v.end());//使用set存放之后可以去重
    cout << "before insert:";
    auto it1 = s.begin();
    while(it1 != s.end())
    {
        cout <<*it1 << " ";
        ++it1;
    }
    cout << endl;
    //insert
    auto a1 = s.insert(4);
    auto a2 = s.insert(4);
    cout << "after insert:";
    it1 = s.begin();
    while(it1 != s.end())
    {
        cout <<*it1 << " ";
        ++it1;
    }
    cout << endl;
    cout << "a1:" << *(a1.first) << ":" << a1.second << endl;
    cout << "a2:" << *(a2.first) << ":" << a2.second << endl;
    cout << "---------------------------" << endl;
    s.erase(4);
    cout << "after erase";
    it1 = s.begin();
    while(it1 != s.end())
    {
        cout <<*it1 << " ";
        ++it1;
    }
    cout << endl;
}

image-20230513123204561.png

3.swap

交换两个set对象,效率比算法库里实现的高

a099793c4dc96a3b92e7d317be79cd1d.png


4.clear

清除set对象中所有数据,但是不删除set对象

b69cf3b6494468ae858ad67af2c687d8.png


6.其他操作接口

1.find

查找set中某个元素,并返回迭代器,如果不存在,就返回end()。

e2c45dc1cff6f32a2af9b37086fb8f21.png

2.lower_bound

以传入的值为下限,返回一个迭代器

ab656e7ae54d1e0d83e8542dc8f69c4a.png

3.upper_bound

以传入的值为上限,返回一个迭代器

528f381b74d1177411fe1c6579a37915.png

void Test4()
{
    set<int> s;
    for(int i = 1; i < 10; ++i)
        s.insert(10 * i);
    auto it = s.find(30);
    if(it != s.end())
        s.erase(it);
    for(const auto& e : s)
    {
        cout << e << " ";
    }
    cout << endl;
    auto it1 = s.lower_bound(40);
    auto it2 = s.upper_bound(70);//注意,这里返回的是70的下一个位置
    s.erase(it1,it2);//这里的删除的迭代器区间是前闭后开的
    for(const auto& e : s)
    {
        cout << e << " ";
    }
    cout << endl;
}

除了set之外,在set头文件中还包含了一个容器:multisetmultiset使用文档

multiset与set极其相似,唯一的不同点就是multiset支持在内部插入重复的数据。

void Test5()
{
    vector<int> v = {1,3,5,2,6,3,5,1};
    set<int> s(v.begin(), v.end());
    multiset<int> ms(v.begin(), v.end());
    cout << "     set:";
    for(const auto& e : s)
    {
        cout << e << " ";
    }
    cout << endl;
    cout << "multiset:";
    for(const auto& e : ms)
    {
        cout << e << " ";
    }
    cout << endl;
}


这里补充一个在set里面没有介绍的接口:count:计算val在multiset中的个数,也可以用来判断set中是否存在该元素。

f611af5239fab565357014f7241c8182.png

相关文章
|
6天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
17 3
|
8天前
|
设计模式 存储 Android开发
c++的学习之路:18、容器适配器与反向迭代器
c++的学习之路:18、容器适配器与反向迭代器
18 0
|
2天前
|
C++ 容器
STL—map容器
STL—map容器
|
6天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
6天前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
7天前
|
存储 自然语言处理 C++
c++的学习之路:25、map与set
c++的学习之路:25、map与set
10 0
|
13天前
|
C++ 容器
约瑟夫经典问题C++,STL容器queue解法
约瑟夫经典问题C++,STL容器queue解法
12 0
|
14天前
|
程序员 索引 Python
06-python数据容器-set(集合)入门基础操作
06-python数据容器-set(集合)入门基础操作
|
1天前
|
Prometheus 监控 Cloud Native
构建高效的Docker容器监控体系
【4月更文挑战第28天】 在微服务架构和容器化部署日益普及的今天,对容器进行有效的性能监控成为确保系统稳定性的关键。本文将深入探讨如何构建一个高效的Docker容器监控体系,覆盖从监控指标的选择、数据采集、存储到可视化展示的全流程。我们将分析现有监控工具的优势与局限,并提出一种综合使用Prometheus、Grafana和自定义监控脚本的解决方案,旨在为运维人员提供实时、准确的容器监控数据,帮助快速定位并解决潜在问题。
14 1
|
5天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)