iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中 set的用法
  • 582
分享到

C++中 set的用法

2024-04-02 19:04:59 582人浏览 泡泡鱼
摘要

目录1、创建set1.1 方法11.2 方法21.3 方法三2、使用set2.1 insert2.2 emplace2.3 emplace_hint2.4 erase2.5 clea

前言:

今天咱们继续来聊聊c++中的set。

上次的文章C++ set到底是什么遗留了一个问题没有回答,有些小伙伴有些疑问。就是为什么说set是关联式的容器,这个关联体现在哪里。

其实很简单,我们说过set的内部使用了红黑树对所有的元素进行了排序。在树结构当中,我们通常使用的都是<key, value>的形式。其中的key用来排序,value则是我们实际存储的值。只不过set有些特殊,它的valuekey是一样的,相当于是<key, key>的形式,所以它依然是关联式的容器。

今天这篇文章主要来聊聊setapi以及一些特殊的用法。

1、创建set

首先是set容器的类模板定义。


template < class T,     // 键 key 和值 value 的类型
           class Compare = less<T>,  // 指定 set 容器内部的排序规则
           class Alloc = allocator<T>  // 指定分配器对象的类型
           > class set;


其中第一个参数表示set当中元素的类型,第二个参数则是set容器内部的排序规则,第三个参数可以忽略,一般用不到。

set有3种构造函数,可以应用在不同的场景当中,我们简单来列举一下。

1.1 方法1


set<string> st;

最常规的一种,没有任何参数,直接创建。

1.2 方法2


set<string> st{"Good", "bad", "medium"};


直接通过花括号枚举我们要传入set的值。

1.3 方法三


set<string> st{"good", "bad", "medium"};
set<string> st2(st);


拷贝创建,从另外一个set当中拷贝元素。

除了这三种形式的构造函数之外,还可以利用set类模板的第二个参数,传入元素排序规则来影响set中元素的排序,这勉强也算

是一种构造方法:


set<string, greater<string>> st{"good", "bad", "medium"};


我们不传入greater的排序结果是"bad", "good", "medium",当我们传入了这个参数之后,结果会变成:"medium", "good", "bad"。

这是因为我们传入的排序规则重新定义了元素的大小关系。

2、使用set

创建完了set就需要使用,使用无非增删改查。

我们先来说说增,往set里添加元素的函数有好几个,我们一个一个来说。

2.1 insert

insert函数非常简单,就直接调用,往set里插入即可。


st.insert("hhh");


但insert还可以批量插入多个元素:


st.insert({"hhh", "wow"});

2.2 emplace

emplace函数的功能和insert一样,可以往set当中插入元素。它和insert最大的区别在于emplace传入的参数并不是要插入的元素,而是构造元素需要的参数。

我这么说估计有点难理解,其实很简单,我们来对比一下就知道了。

假设我们有一个set它的类型是结构体P,当中我们重载了它的比较算子,这个先忽略。


struct P {
 int x, y;
    P(int x, int y) : x(x), y(y){};
    bool operator<(const P b) const  {  
         return this->x < b.x;  
    } 
};

set<P> st;

如果我们要使用insert应该怎么操作呢?


P p{0, 3};
st.insert(p);


如果使用emplace函数呢,则是这样:


st.emplace(1, 23);


因为emplace的内部会替我们去调用结构体P的构造函数,使用1和23这两个参数构造出一个P的实例来存入set当中。

使用emplace可以节省掉创建实例的一步,所以通常工程当中往往大量使用emplace

emplace函数返回的结果是一个pairpair的第一个元素是set的迭代器,表示插入的元素的位置,第二个值是一个bool,表示是否插入成功。

2.3 emplace_hint

emplace函数的改进版,接受额外的参数表示插入set的位置。它的返回结果也有了一些变化,返回的是一个迭代器。

如果插入成功则返回新添加的元素,否则则指向set容器中和添加元素相同的元素。

使用emplace_hint会影响set中的有序性,一般不建议使用。

2.4 erase

说完了插入再说说删除,在set当中删除的方法只有一个就是erase,但是它却有好几种用法。

我们直接来看它的函数签名:


size_type erase (const value_type& val);
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);


第一种方法我们传入了一个val值,也就是我们要删除的元素。

第二种方法我们传入的是一个迭代器,它会删除迭代器指向的元素。第三种方法类似,只不过我们传入的是两个迭代器,表示一个范围,它会删除这个范围内所有的元素。

第一种方法的返回值是一个整数,表示删除的元素个数。后面两种返回的都是一个迭代器,指向删除元素后面一个位置。

2.5 clear

清空set。

2.6 find

set中的查询函数,传入我们要查询的value,返回一个迭代器。


set<string>::iterator it = st.find("good");


如果成功找到则返回指向该元素的迭代器,否则指向end

2.7 count

同样是查询函数,只不过它返回的不再是迭代器,而是一个整数,表示查询到元素的个数。


int cnt = st.count("good");

2.8 lower_bound 和 upper_bound

lower_boundupper_bound严格也算是查询函数,只不过它们查询的范围。lower_bound查询的是set当中第一个大于等于val的位置,而upper_bound查询的是set中第一个严格大于val的位置。


set<string>::iterator it_low = st.lower_bound("i");
set<string>::iterator it_up = st.upper_bound("i");


同样这两个函数返回的是一个迭代器。

2.9 equal_range

这个函数返回的是一个pair,它的第一个元素是lower_bound的结果,第二个元素是upper_bound的结果。


pair<set<string>::iterator, set<string>::iterator> ret = st.equal_range("i");

3、总结

到这里,关于set常用的方法基本上就都介绍完了,除此之外还有一些其他细枝末节的方法就不赘述了。比如像是size(),max_size()等等,大家有用到去查询即可。

但是有一个疑问不知道大家有没有发现,就是我们没有介绍到修改的函数。是set不支持修改吗?

关于这个问题的答案并不是老梁故意卖关子,而是它非常复杂,一句两句很难说清楚,老梁将在下一篇文章当中好好探讨一下这个问题。如果大家有修改元素的需求,可以用erase + insert代替。

到此这篇关于C++中 set的用法的文章就介绍到这了,更多相关C++ set用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

注:文章转自微信公众号:Coder梁(ID:Coder_LT)

--结束END--

本文标题: C++中 set的用法

本文链接: https://www.lsjlt.com/news/156210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中 set的用法
    目录1、创建set1.1 方法11.2 方法21.3 方法三2、使用set2.1 insert2.2 emplace2.3 emplace_hint2.4 erase2.5 clea...
    99+
    2024-04-02
  • c++中set的用法详解
    c++kquote>set 是一种存储不重复且有序元素的容器,元素的顺序由比较函数决定。创建 set 使用 set 语法,插入元素用 insert() 方法,查找元素用 find(...
    99+
    2024-05-01
    c++
  • C++中set的用法学习
    目录创建Set对象添加元素删除元素迭代器的使用总结Set是C++ STL(标准模板库)的一个容器类,它用于存储不同的值,并且可以按照特定顺序进行访问和操作。Set是一种基于红黑树实现...
    99+
    2023-05-19
    C++ set用法 C++ set使用 C++ set
  • c++中get和set的用法
    get() 方法用于获取对象成员变量的值,而 set() 方法用于设置对象成员变量的值。get() 方法的语法为:t get() const; set() 方法的语法为:void set...
    99+
    2024-05-01
    c++
  • Python中set的用法
    python 的集合类型和 其他语言类似, 是一个无序不重复元素集,我在之前学过的其他的语言好像没有见过这个类型,基本功能包括关系测试和消除重复元素.集合对象还支持union(联合), intersection(交), ...
    99+
    2023-01-31
    Python set
  • C#集合之集(set)的用法
    包含不重复元素的集合称为“集(set)”。.NET Framework包含两个集HashSet<T>和SortedSet<T>,它们都...
    99+
    2024-04-02
  • C#中{get;set;}的具体使用
    在C#程序中经常会看到set,get的配套使用,很多人不知道它的用途。我就在这向大家讲讲,也加深一下自己的印象。 //这里有两个类 public class person1 { ...
    99+
    2023-02-06
    C# {get;set;} C# GET SET
  • C#之set与get方法的用法案例
    需求:学生输入姓名和语文、数学、英语,编程求出总分和平均分,并在屏幕上显示XX的总分和平均分 using System; using System.Collections.Gen...
    99+
    2024-04-02
  • VBS中Set语句的用法
    这篇文章主要介绍“VBS中Set语句的用法”,在日常操作中,相信很多人在VBS中Set语句的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VBS中Set语句的用法”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-08
  • C#的set怎么使用
    本文小编为大家详细介绍“C#的set怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#的set怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。包含不重复元素的集合称为“集(set)”。.NET F...
    99+
    2023-06-30
  • c++中set遍历取值的方法是什么
    在C++中,可以使用迭代器来遍历set中的元素。具体方法如下: #include <iostream> #include...
    99+
    2024-03-04
    c++
  • C++中map和set如何使用
    这篇文章主要介绍了C++中map和set如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中map和set如何使用文章都会有所收获,下面我们一起来看看吧。一、set1.1 set的介绍首先要知道set...
    99+
    2023-07-05
  • VBS中Property Set语句的用法
    本篇内容主要讲解“VBS中Property Set语句的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VBS中Property Set语句的用法”吧!Property Set 语句在 Cla...
    99+
    2023-06-08
  • python中set()的用法是什么
    set()函数用于创建一个集合(set),集合是一个无序且不重复的数据集合。可以将可迭代对象(如列表、元组、字符串等)作为参数传递给...
    99+
    2024-03-02
    python
  • C#中get、set函数怎么用
    这篇文章将为大家详细讲解有关C#中get、set函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C# get set不提倡将域的保护级别设为 public而使用户在类外任意操作--那样太不OO,或...
    99+
    2023-06-17
  • vue中$set用法详解
    目录1、为什么要用set?2、set用法3、什么时候使用set?4、文档地址摘要:地址没有改变,vue就监测不到数据变化。这个时候,双向绑定就失效了。 想了解有关JS堆栈的知识?请点...
    99+
    2022-12-09
    vue中$set用法 $set使用 vue中的$set
  • c++ set遍历的方法是什么
    在C++中,可以使用迭代器或者范围循环来遍历Set。1. 使用迭代器遍历Set:```cpp#include #include in...
    99+
    2023-09-15
    c++
  • C++中set/multiset与map/multimap的使用详解
    目录一、关联式容器二、set的介绍1、接口count与容器multiset2、接口lower_bound和upper_bound三、map的介绍1、接口insert2、接口inser...
    99+
    2023-02-14
    C++ set/multiset map/multimap使用 C++ set/multiset C++ map/multimap
  • Python中关于set的基本用法
    目录1. set 的基本内容1.基本特点2.set() 实质2. set 的基本方法2.1 set 的普通基本方法2.2 set 的逻辑基本方法总结1. set 的基本内容 1.基本...
    99+
    2023-05-17
    Python中set set的基本用法 Python set的用法
  • SQL Server中set quoted_identifier的使用方法
    小编给大家分享一下SQL Server中set quoted_identifier的使用方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作