c++ set 遍历_47. Set 是如何工作的(3) 遍历顺序是如何确定的?

ebbc96f314f45c5061bd5b418fac4ea6.png

Set 是无序容器,它的插入顺序与迭代(或者 print)输出的顺序不保证与插入顺序一致,与 Dict 类似的问题,Set 的输出顺序是如何决定的呢?

首先我们从 Set 的输出开始寻找蛛丝马迹,在 Dict 的研究中,我们知道对象的输出由 *_repr 函数实现,对于 SetObject 这个函数是 set_repr:

// Objects/setobject.c:579set_repr(PySetObject *so)
{// ··· ···// Set 转换为 Listkeys = PySequence_List((PyObject *)so);// ··· ···// 获得 List 的字符串listrepr = PyObject_Repr(keys);// 截掉 List 输出左右两端的 "[" 和 "]"tmp = PyUnicode_Substring(listrepr, 1, PyUnicode_GET_LENGTH(listrepr)-1);// ··· ···// 拼接输出// ··· ···return result;
}

Set 的输出经历了以下步骤:

  • Set 转换为 List;
  • List 转换为 String;
  • 舍弃 List 输出左右两端的方括号,替换为小括号 ();

我们又一次见到了熟悉的面孔 PySequence_List,该函数的作用是将可迭代对象转换为 List 对象。Set 也是可迭代对象,具体的迭代操作由:

// Objects/setobject.c:867static PyObject *setiter_iternext(setiterobject *si){// ··· ···
}

该函数的代码表明 Set 对象的遍历,实际上是对 Set->table 的遍历,但是会忽略 NULL 和 dummy 元素。Set 的遍历顺序由其 table 中 entry 的实际排布决定。Set 元素的插入方式,可以参看上一节的介绍,其中包含了 Set 的 lookup 逻辑。

验证

下面以一个简单的例子验证我们的理解。首先创建一个空的 Set,命名为 a。为了方便,依然使用整数作为 Key,原因是整数的 hash 就是它们自身。

a = set()

此时 a 的 table 长度为初始值 8。依次插入 1~4,会分别插入 table[1~4]。当插入 5 的时候,5/8 > 3/5,table 会伸缩到 4 倍有效元素数量 5 * 4 = 20,在实际分配的时候,内存尺寸会对 2^n 向上取整, 实际伸缩 table 长度到 32。

a.update([1,2,3,4])

此时 table 的样子:

19dab5fc273096361a28ea23357d125d.png

下面插入 5:

# resize the table firstly, then insert.
a.add(5)

经过 resize 的 table 看起来如此:

ff889ce485387b0e5e41c754060eb5f6.png

如果将 a 打印出来,输出的顺序应该就是 1~5,#0 处的 NULL 会被忽略掉。

print(a)

输出:

{1, 2, 3, 4, 5}

注意,此时 table 的长度已经是 32 了,下面插入一个较大的 Key = 32,对 32 求模刚好为 0,那么它会被插入到 #0:

a.add(32)
print(a)

8d4f1df9016e570eb086f93f67174e1d.png

上面的输出也可以印证这一点,输出:

{32, 1, 2, 3, 4, 5}

新插入的 32 打破了插入顺序和 Key 的大小顺序。 同理:

  • 如果继续插入 Key = 39,它会出现在 #7 的位置;
  • 再插入 Key = 70,则会出现在 #6 的位置;

9c9752832d32c975e902cfff7518c231.png

我们通过代码来验证

a.add(39)
a.add(70)
print(a)

输出:

{32, 1, 2, 3, 4, 5, 70, 39}

哈! 与预期完全一致!

关注我,了解程序员的烧脑日常,还有开源 Python 教程。

d06446a59c42c004460640c32dfce9ce.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟着“土牛”学架构知识

这里的土牛是指abp的作者,土耳其人,简称“土牛”,前两天看了他分享的ppt,这里做个小笔记。架构分层图一(abp作者)图二(clean架构)图三(在朋友圈看到的)每种架…

《C++ Primer》2.6.1节练习

练习2.39: 在类体花括号后加一个分号就好了。 练习2.40: 代码如下: struct Sales_data{std::string bookNo;//书籍编号unsigned units_sold 0;//销售量double sellingprice 0.0;//零售价double saleprice 0.0//实售价double discount 0…

Cef mysql.exe_CEF3.2623使用记录:windows编译

CEF3.2623使用记录:windows编译1:cef3.2623下载地址2623是cef3最后一个支持xp系统的版本,且可以支持html的audio标签,可以用作对html音频的处理下载地址为 https://bitbucket.org/chromiumembedded/cef/branch/2623。下载win32版本…

Asp.Net Core 中IdentityServer4 授权流程及刷新Token

一、前言上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权流程及refreshtoken。系列文章目录(没看过的先看这几篇文章再来…

C++关于const限定符,这一篇足够!!!

C关于const限定符,这一篇足够!!!const限定符初始化和constconst引用初始化和对const的引用对const的引用可能引用一个并非const对象指针和constconst指针顶层constconst限定符 有时候我们希望定义这样一种变量,它的值不能被改变。…

liunx版mysql服务无法启动_linux环境下mysql无法启动

无论发现怎样的问题,首先查看err日志。问题一:查询err日志显示权限问题。分析:mysql原本是所属mysql用户,如果在root用户下启动就有可能出现问题。解决:(1)查看mysql的权限(2)发现有root权限,混乱了。所以先…

玩转控件:重写/重绘Dev中MessageBox弹窗控件

很久没有更新博客了,本想着直接发一篇《手撕ERP》系列,从控件重写、重绘,到框架搭建,再到部分模块实现业务的。但是每次动手的时候,都觉得难以下手。直接从数据库设计开始吧,模块设计还没定下来&#xff0c…

.NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记...

26 | 工程结构概览:定义应用分层及依赖关系从这一节开始进入微服务实战部分这一节主要讲解工程的结构和应用的分层在应用的分层这里定义了四个层次:1、领域模型层2、基础设施层3、应用层4、共享层可以通过代码来看一下源码链接:https://githu…

容器网络是如何影响Kubernetes中数据库性能的?

关于Kubernetes中的数据库,大家最关心的第一个问题是性能。由于这种担心的存在,许多使用Kubernetes进行生产应用程序工作的客户正在Kubernetes之外的裸机或VM上运行数据库。因此,我们致力于深入研究Kubernetes抽象层,确定值得测试…

mysql php状态函数_mysql_stat()查询MySQL服务器当前系统状态

mysql教程:mysql_stat()查询MySQL服务器当前系统状态 定义和用法 mysql_stat() 函数返回 MySQL 服务器的当前系统状态。 如果成功,则该函数返回状态。如果失败,则返回 false。 语法 mysql_stat(connection)参数 描述 connection 可mysql教程&…

聊聊面试的事(应聘方)

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「134」篇原创敬上原本春节长假之后会有不少人开始新的面试之旅。但是疫情的到来打乱了这个节奏,包括招聘方的计划。因此,在以往是金三银四的…

mysql边备份边导入么_MySQL 怎么导入导出操作

mysql 如何导入导出操作1、MySQL 如何导入导出个别需要数据记录?– 先导出数据所在的表结构:mysql> show create table CHARBASE into outfile “/db/mysql/RS.sql” ;– 将需要单独导出的内容存放在文本文件里,这里一定要注意存放的位置必…

Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)

在前面两篇文章中,我介绍了基于IdentityServer4的一个Identity Service的实现,并且实现了一个Weather API和基于Ocelot的API网关,然后实现了通过Ocelot API网关整合Identity Service做身份认证的API请求。今天,我们进入前端开发&a…

[蓝桥杯][算法提高VIP]因式分解

解题思路&#xff1a; 水题&#xff01;&#xff01;&#xff01; 代码如下&#xff1a; #include <iostream> using namespace std; const int N 100010; int p[N]; int k; bool vis[N];void init() {for (int i 2;i<N-1;i){if (!vis[i])p[k] i;for (int j 2*i…

win10 64位操作系统安装mysql_win10,64位操作系统安装mysql-8.0.16经验总结(图文详细,保证一次安装成功)...

机器配置&#xff1a;win10&#xff0c;64位&#xff1b;mysql-8.0.161.mysql下载首先在mysql下载链接下载安装包&#xff1a;点击 Download 按钮进入下载页面&#xff0c;点击下图中的 No thanks, just start my download. 就可立即下载&#xff1a;2.解压及配置文件下载完后&…

基于 Roslyn 实现一个简单的条件解析引擎

基于 Roslyn 实现一个简单的条件解析引擎Intro最近在做一个勋章的服务&#xff0c;我们想定义一些勋章的获取条件&#xff0c;满足条件之后就给用户颁发一个勋章&#xff0c;定义条件的时候会定义需要哪些参数&#xff0c;参数的类型&#xff0c;获取勋章的时候会提供所需要的参…

BeetleX之vue-autoui自匹配UI插件

vue-autoui 是一款基于vue和element扩展的一个自动化UI控件&#xff0c;它主要提供两个控件封装分别是auto-form和auto-grid; 通过这两个控件可以完成大多数的信息输入和查询输出的需要.auto-form和auto-grid是通过json来描述展示的结构&#xff0c;在处理上要比写html标签来得…

protobufjs 命令执行_protobufjs简单使用

npm i protobufjs -D添加两个proto文件User.protosyntax "proto3";package login;message PBUser {string uid 1;string pwd 2;int64 age 3;}Login.protosyntax "proto3";package login;import "./User.proto";message LoginReq {PBUser us…

.NET Core开发实战(第27课:定义Entity:区分领域模型的内在逻辑和外在行为)--学习笔记...

27 | 定义Entity&#xff1a;区分领域模型的内在逻辑和外在行为上一节讲到领域模型分为两层一层是抽象层&#xff0c;定义了公共的接口和类另一层就是领域模型的定义层先看一下抽象层的定义1、实体接口 IEntitynamespace GeekTime.Domain {public interface IEntity{object[] G…

Abp vNext发布v2.3!

在全球范围内病毒笼罩的日子里,我们发布了ABP框架v2.3, 这篇文章将说明本次发布新增内容和过去的两周我们做了什么.关于新冠病毒和我们的团队关于冠状病毒的状况我们很难过.在Volosoft的团队,我们有不同国家的远程工作者在自己家里工作.从上周开始,我们已经完全开始在家远程工作…