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…

mysql innodb status_查看innodb的运行状态

show innodb status 在以后的mysql版本将会被show engine innodb status所替代。总所周知show engine innodb status是用来查看当前的mysql数据库中innodb表的相关状态。1:show engine innodb status。-----------------------------------| Type | Name | Status |…

[蓝桥杯][算法提高VIP]扫雷-枚举

题目描述 扫雷游戏你一定玩过吧&#xff01;现在给你若干个nm的地雷阵&#xff0c;请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数&#xff0c;每个单元格最多有8个相邻的单元格。 0< n,m< 100 &#xff08;注意两个矩阵之间应该有一个空行&#xff0c;由于oj的…

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

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

mysql outfile 变量_转mysql dumpfile 与 outfile 函数的区别

一直以为两个函数作用是相同的 经过简单测试发现还是有些区别的 如下表admin mysql select * from admin; ------------------------- | uid | name | pass | ------------------------- | 1 | admin | baidusb | | 2 | root | hacksb | | 3 | manage一直以为两个函数作用是相同…

[蓝桥杯][算法提高VIP]排列式-全排列

题目描述 7254是一个不寻常的数&#xff0c;因为它可以表示为7254 39 x 186&#xff0c;这个式子中1~9每个数字正好出现一次 输出所有这样的不同的式子&#xff08;乘数交换被认为是相同的式子&#xff09; 结果小的先输出&#xff1b;结果相同的&#xff0c;较小的乘数较小的…

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

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

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

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

聊聊面试的事(应聘方)

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

[信息学奥赛一本通-T1620]质因数分解-数论

题目描述 原题来自&#xff1a;NOIP 2012 普及组 已知正整数 n 是两个不同的质数的乘积&#xff0c;试求出较大的那个质数。 输入 输入只有一行&#xff0c;包含一个正整数 n。 输出 输出只有一行&#xff0c;包含一个正整数 p&#xff0c;即较大的那个质数。 样例输入 21 样…

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

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

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

在前面两篇文章中&#xff0c;我介绍了基于IdentityServer4的一个Identity Service的实现&#xff0c;并且实现了一个Weather API和基于Ocelot的API网关&#xff0c;然后实现了通过Ocelot API网关整合Identity Service做身份认证的API请求。今天&#xff0c;我们进入前端开发&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.解压及配置文件下载完后&…