首页 > 编程语言 >C++ 标准模板库 STL(1)set 与 multiset

C++ 标准模板库 STL(1)set 与 multiset

时间:2024-04-09 20:59:54浏览次数:23  
标签:std set STL 元素 C++ 查找 setInts multiset

一、简介

        set与multiset容器能够快速查找键,键是存储在一维容器中的值,二者的区别在于前者不能够存储重复的键值,后者能够存储重复键值。

        set与multiset内部结构类似于二叉树,并且被插入到set与multiset容器中的元素会默认进行排序,从而提高查找速度。这意味着set与multiset不能够像vector那样可以使用其他元素替换给定位置的元素。

二、基本操作

2.1 头文件

#include <set>

2.2 初始化

// 初始化int类型的 set 和 multiset
std::set<int> setInts;
std::multiset<int> msetInts;

// 声明指向 set 和 multiset 的迭代器
std::set<int>::iterator element;
std::set<int>::const_iterator element; // const 无法修改值

std::multiset<int>::iterator element;
std::multiset<int>::const_iterator element; // const 无法修改值

        如果没有指定排序标准,set和multiset将默认使用std::less进行排序,即升序排序。倘若想要按照降序排序,可以使用std::greater初始化。

#include <functional>

// 默认升序排列, 例如 1, 2, 3, 4, 5
std::set<int> setInts;

// 降序排列, 例如 5, 4, 3, 2, 1
std::set<int, std::greater<int>> setInts;

        除了使用标准库提供的函数,还可以自定义比较函数。

template <typename T>
struct MyCompare {
    bool operator()(const T& a, const T& b) const {
        return a > b;
    }
};

std::set<int, MyCompare<int>> setInts;
std::multiset<int, MyCompare<int>> setInts;

2.3 插入元素

        使用insert()函数能够向两种容器插入元素,这个函数接受要插入的值或者容器的指定范围。

setInts.insert(-1);
msetInts.insert(setInts.begin(), setInts.end());

        对于multiset容器,可以使用其成员函数count来计数容器中包含了多少个该元素值。

// 计数容器中有多少个-1
msetInts.count(-1);

2.4 查找元素

        使用find()函数能够根据给定的键来查找值。对于multiset,find()函数查找第一个与给定键匹配的元素。

// 查找-1元素是否在set中
auto elementFound = setInts.find(-1);

// 判断是否找到元素
if(elementFound != setInts.end()) {
    cout << *elementFound << endl;
} else {
    cout << "Not Found!" << endl;
}

2.5 删除元素

        使用erase()能够删除给定的键值,该函数还可以接受迭代器变量或者使用迭代器指定的边界,如果使用迭代器边界删除键值,那么该范围内的所有元素都将从容器中删除。

// 删除-1元素
setInts.erase(-1);

// 查找-1并删除
auto element = setInts.find(-1);
setInts.erase(element);

// 删除setInts的所有元素
setInts.erase(setInts.begin(), setInts.end());

        对于multiset容器,erase()将删除所有与键值相同的元素。

#include <set>
#include <iostream>

using namespace std;

template <typename T>
void DisplayContents (const T& Input) {
    for(auto e = Input.cbegin(); e != Input.cend(); e++) {
        cout << *e << " ";
    }
    cout << endl;
}

int main() {
    multiset<int> msetInts{43, 78, 78, -1, 124};

    // 输出当前所有元素
    cout << msetInts.size() << endl;
    DisplayContents(msetInts);

    // 删除78
    cout << msetInts.count(78) << endl;
    msetInts.erase(78);

    // 输出当前所有元素
    cout << msetInts.size() << endl;
    DisplayContents(msetInts);

    return 0;
}

        上面的代码输出内容如下:

5
-1 43 78 78 124
2
3
-1 43 124

三、优缺点

        对于需要频繁查找的程序来说,set和multiset很有优势,因为其内容是经过排序的,因此查找速度要快很多。但这为插入元素带来额外的开销。所以在需要频繁插入而很少查找的情况下,应当尽可能使用std::vectorstd::list,而不是std::setstd::multiset

        set和multiset使用find()查找到元素后无法像vector一样直接使用迭代器对元素值进行修改,因为这样会打乱元素的排序顺序。

        

标签:std,set,STL,元素,C++,查找,setInts,multiset
From: https://blog.csdn.net/m0_46582374/article/details/137522637

相关文章

  • 突破编程_C++_网络编程(Windows 套接字(setsockopt 选项设置))
    1setsockopt函数介绍Windows套接字(Winsock)的setsockopt函数是用于设置套接字选项的重要工具。通过这个函数,开发者可以调整套接字的行为,以满足特定的网络应用需求。(1)函数原型intsetsockopt(SOCKETs,intlevel,intoptname,constchar*optval,intop......
  • MinGW-w64 C/C++编译器的下载和安装
    1.介绍        MinGW(“MinimalistGNUforWindows”),以前称为mingw32,是一个用于创建MicrosoftWindows应用程序的免费开源软件开发环境。        MinGW-w64项目是gcc的完整运行时环境,支持Windows64位和32位操作系统本机二进制文件。2.安装包下载......
  • vue中的<script setup>与<script>
    <scriptsetup>是在vue3.2之后新增的语法糖,简化了API的写法1.声明的变量无需return,可以直接在模板中使用,实现了顶层的绑定2.引入组件会自动注册,无需再使用components<script>exportdefault{data(){return{dialogVisible:false};},};</script>-----......
  • C++常见错误及分析
    warning:'typedef'wasignoredinthisdeclaration问题代码:点击查看代码typedefstructsqList{//把typedef删掉intarrayList[maxSize];intlengthList;};//或者是在后面加上sqList。error:invalidtypes'int[int]'forarraysubscript(数组下标......
  • # C++之STL整理(7)之queue用法(创建、赋值、增删查改)详解
    C++之STL整理(7)之queue用法(创建、赋值、增删查改)详解注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的queue用法整理C++之STL整理(7)之queue用法(创建、赋值、增删查改)详解queue1.queue构造函数2.queue存取、插入和删除操作3.......
  • 54、C++内存模型
    在 C++ 中,程序运行时,内存主要分成四个区,分别是栈、堆、数据段和代码段。                栈:存储局部变量、函数参数和返回值。堆:存储动态开辟内存的变量。数据段:存储全局变量和静态变量。代码段:存储可执行程序的代码和常量(例如字符常量),此存储区不可修......
  • 突破编程_C++_网络编程(Windows 套接字(API 接口(2)))
    1TCP连接管理1.1connect函数connect函数用于发起一个TCP连接请求到远程服务器。这个函数通常用于客户端套接字,以建立与服务器的连接。(1)函数原型intconnect(SOCKETs,conststructsockaddr*name,intnamelen);(2)参数说明s:一个已创建但未连接的套接字描述符......
  • 【每周例题】力扣 C++ 移除元素
    移除元素题目移除元素 思路分析1.涉及到容器,那么就很直接的想法,遍历容器,找出与val相同的数,移除,然后利用函数输出长度与移除后的数组2.移除部分我们使用指针去处理,用指针遍历数组,符合移除条件的利用erase函数移除注:这里使用到了一个万能头文件,参加蓝桥杯的同学可以试试运用......
  • 【每周例题】蓝桥杯 C++ 多数
    多数元素题目多数元素思路分析一.第一个想法,暴力遍历,然后会发现容易超时,那么更进一步想:哈希表使用哈希表存储每个数出现的次数,即使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数加入后,遍历所有键值对,......
  • C++程序分享--常见编程面试题:判断字符串是否为回文串
    关注我,持续分享逻辑思维&管理思维;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。【图解《程序员面试常见的十大算法......