前言 一切要从小伙子在python学习网站上的一道练习题说起。题目如下: 简单说,就是打印一个文件夹下,所有文件名字,包括所有子文件夹中的文件。如果只是用 python 提供的内置模块,是非常容易。...如此类推,直到栈中没有东西,程序就会执行结束 这里我们需要关注的重点就是左边的容器 左边类似木桶的容器叫 栈。...不用想复杂了,大家可以把它看成是遵守某些规则的 list 往 栈 中放入一个东西, 只能从"木桶口"进入 ,一个个堆叠起来,不允许插队 往 栈 中取出一个东西, 只能从"木桶口"最上面取 所以,栈的规则可以简化成...显然第一个任务就是传进来的文件夹路径 行5:使用 while 循环,条件是所有任务都处理完毕(任务列表为空) 行7:循环里面,每次取出一个任务(文件夹路径),得到该文件夹中的所有路径 行13:如果是文件夹路径...,那就是一个新的任务,直接放进去任务列表中(stack) 小伙子非常满意,感觉自己的 python 水平大幅提升。
SQLException堆栈跟踪信息 d.编译错误,因为我们不能将SQLException类型转换成RuntimeException 好,我们能从题目中得到什么信息?...题目中的泛型涉及到了类型擦除,以及一些异常。...那么我们能从这段代码中看出什么呢?我们有一个方法,它返回一个集合,这个集合包含了某个人的好友圈。方法中有一个循环,它检查一个person对象的bestfriend属性是否为null。...关于使用两个花括号进行容器的初始化,可参考这里(right here)。 5、对于运行时Map容器的离奇事件 这是另一个社区贡献的问题,贡献者是来自以色列的Barak Yaish。...下一行,“foo”键值存在于map容器中,所以我们计算右边的表达式。ArrayList对象成功转换为List类型,然后“ber”字符串被插入到List中。
所有迭代器和引用保持有效。在操作后,未指明保有此容器中 end()值的迭代器指代此容器还是另一容器。...逆转容器中的元素顺序。不非法化任何引用或迭代器。...从容器移除所有相继的重复元素。只留下相等元素组中的第一个元素。若选择的比较器不建立等价关系则行为未定义。 函数原型 //用 operator== 比较元素。...函数原型 //从容器中擦除所有比较等于value的元素, //等价于 return c.remove_if([&](auto& elem) { return elem == value; }); template...typename std::list::size_type erase(std::list& c, const U& value); //C++20 起 //从容器中擦除所有满足
[-F DEVICE | --file=DEVICE] [-g|--save] 3.选项说明 -a, --all 以可读的格式打印当前的所有设置。...-g, --save 以终端可读的格式打印当前的所有设置。 -F, --file 打开指定的设备,并用此设备作为输入来代替标准输入。 --help 显示帮助并退出。...当不附加参数时,程序会输出波特率、行约束 规则以及与标准 stty 设置间的偏差。...4.常用示例 (1)以可读的格式打印当前的所有设置。...isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke (2)以终端可读的格式打印当前的所有设置
输入以下命令检查是否设置了 IDF_PATH: printenv IDF_PATH 将此前在脚本文件中输入的路径打印出来。...改成斜杠 双击一个命令行窗口 打印一下路径,看看是不是成功了 如果您不想在用户配置文件中永久设置 IDF_PATH,则应在打开 MSYS2 窗口时手动输入: export IDF_PATH="C:/msys32...执行make all.编译一次 make flash烧录到目标机器 bin就是要烧录的文件 可以看一下串口号 输入命令 make monitor。...需要COMPONENT = make delete_flash-擦除整个Flash内容 进行delete_otadata-擦除ota_data分区;第一个可引导分区(工厂或OTAx...-仅构建应用程序 使应用程序闪现-仅对应用程序进行闪现 使应用程序清洁-仅清洁应用程序 make print_flash_cmd-刷新时为esptool打印参数 make check_python_dependencies
extends E> 表示要操作的数据是 E 的子类的列表,指定上限,这样容器才够大 泛型的类型擦除 Java 中的泛型和 C++ 中的模板有一个很大的不同: C++ 中模板的实例化会为每一种类型都产生一套不同的代码...Java 中并不会产生这个问题。虚拟机中并没有泛型类型对象,所有的对象都是普通类。...其原因就是泛型的擦除。 擦除的实现原理 一直有个疑问,Java 编译器在编译期间擦除了泛型的信息,那运行中怎么保证添加、取出的类型就是擦除前声明的呢?...) 不可变:不论 A B 有什么关系,A 的容器和 B 的容器都没有父子关系,称之为不可变 Java 中数组是协变的,泛型是不可变的。...同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
所有迭代器和引用保持有效。在操作后,未指明保有此容器中 end() 值的迭代器指代此容器还是另一容器。 2.2.6 操作 merge 功能描述 合并二个已排序列表。...逆转容器中的元素顺序。不非法化任何引用或迭代器。...从容器移除所有相继的重复元素。只留下相等元素组中的第一个元素。若选择的比较器不建立等价关系则行为未定义。 函数原型 //用 operator== 比较元素。...函数原型 //从容器中擦除所有比较等于value的元素, //等价于 return c.remove_if([&](auto& elem) { return elem == value; }); template...forward_list::size_type erase(std::forward_list& c, const U& value); //C++20 起 //从容器中擦除所有满足
泛型除了可以将类型参数化外,而参数一旦确定好,如果类似不匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为泛型让它只接受 Integer 的类型。...它不管装载在这个容器内的元素是什么类型,它只关心元素的数量、容器是否为空?我想这种需求还是很常见的吧。 有同学可能会想, 既然作用这么渺小,那么为什么还要引用它呢?...正常情况下,因为泛型的限制,编译器不让最后一行代码编译通过,因为类似不匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...: 23 test 42.9 可以看到,利用类型擦除的原理,用反射的手段就绕过了正常开发中编译器不允许的操作限制。...List 和 List 在 jvm 中等同于List ,所有的类型信息都被擦除,程序也无法分辨一个数组中的元素类型具体是 List类型还是
泛型除了可以将类型参数化外,而参数一旦确定好,如果类似不匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为泛型让它只接受 Integer 的类型。...它不管装载在这个容器内的元素是什么类型,它只关心元素的数量、容器是否为空?我想这种需求还是很常见的吧。 有同学可能会想, 既然作用这么渺小,那么为什么还要引用它呢?...正常情况下,因为泛型的限制,编译器不让最后一行代码编译通过,因为类似不匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...List 和 List 在 jvm 中等同于List ,所有的类型信息都被擦除,程序也无法分辨一个数组中的元素类型具体是 List类型还是...所以,我说泛型,并不神秘,也不神奇 。
其函数声明如下: //从容器中擦除所有比较等于 value 的元素 template constexpr typename std::vector...::size_type erase(std::vector& c, const U& value); //C++20 起 //从容器中擦除所有满足 pred...Alloc>::size_type erase_if(std::vector& c, Pred pred); //C++20 起 std::erase(std::vector)从容器中擦除所有比较等于...(it, c.end()); c.erase(it, c.end()); return r; std::erase_if (std::vector)从容器中擦除所有满足 pred 的元素,其返回值为被擦除的元素个数...c中的值等于3的元素 auto erased1 = std::erase(c, 3); // erased1 = 1 // 此时c = {1, 2, 4, 6} // 擦除c中的偶数 auto erased2
泛型除了可以将类型参数化外,而参数一旦确定好,如果类似不匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为泛型让它只接受 Integer 的类型。...它不管装载在这个容器内的元素是什么类型,它只关心元素的数量、容器是否为空?我想这种需求还是很常见的吧。 有同学可能会想, 既然作用这么渺小,那么为什么还要引用它呢?...正常情况下,因为泛型的限制,编译器不让最后一行代码编译通过,因为类似不匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...List 和 List 在 jvm 中等同于List ,所有的类型信息都被擦除,程序也无法分辨一个数组中的元素类型具体是 List类型还是...所以,我说泛型,并不神秘,也不神奇。
不优雅的范围小了一点,并不能解决问题。 这时,我们考虑使用通用类型(泛型),将快排方法的参数设置为一个通用类型,无论什么样的参数,只要实现了 Comparable 接口,都可以传入并排序。...最佳实践 当然,泛型并不是一个万能容器。什么类型都往泛型里扔,还不如直接使用 Object 类型。...如果没有类型相关的逻辑,如 List 作为容器不需要考虑什么类型,那么直接完善通用代码即可。...如快排的元素就实现了 Compare 接口,Object 已经实现了 toString() 方法,所有的打印语句都可以调用它。...如果还没有共同的接口,那么需要考虑是否可以抽象出一个通用的接口实现,如打印人类的衣服颜色和动物的毛皮颜色,就可以抽象出一个 getColor() 接口,抽象之后再使用边界限定通配符。
Sub 是 Base 的子类,不代表 List 和 List 有继承关系。...它不管装载在这个容器内的元素是什么类型,它只关心元素的数量、容器是否为空?我想这种需求还是很常见的吧。 有同学可能会想, 既然作用这么渺小,那么为什么还要引用它呢?...正常情况下,因为泛型的限制,编译器不让最后一行代码编译通过,因为类似不匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...List 和 List 在 jvm 中等同于List ,所有的类型信息都被擦除,程序也无法分辨一个数组中的元素类型具体是 List不神奇。
垃圾回收是在正在运行的程序中查找将来无法访问的数据对象,并回收那些对象所使用的资源(尤其是内存)的过程。 自动垃圾收集的语言--Java,C#,Python和大多数脚本语言。...Python使用引用计数,好处是当引用计数变为0时,它可以立即回收对象。这样做的代价是需要为每个对象存储一个附加的整数值。可达性分析(Java中使用)的好处是可以在独立的线程中执行,从而提高性能。...缺点是,当垃圾收集器运行时,程序会暂停所有的线程。...,且都能存放不同类型的数据,都能进行索引进行访问a[i] 不同点: 元组的是不可变的,不能改变索引a[i]的值,也不能从元组中增加/删除元素;但是列表可以。...不可变带来的好处:性能提升,容器友好,线程安全。元祖可以放在集合set中并用作键值,但列表不行。创建元组和访问速度稍快,并且内存占用量较小。
根据flash的操作特点,一方面是flash是只能从1变为0,不能从0写到1。只有当擦除一个页的时候,才能将该页上的数据从0变为1。...假如用户数据是一连串的状态信息,每次都只会改变其中的一个状态,或者一个字节,那么每次操作都会将flash上所有的用户数据读到内存中,然后将内存中的数据的变化的状态位改变,然后再擦除page,接着再将内存中的数据写到...由于flash的读写寿命有限,在10w次左右,并且擦除page消耗的时间很长。所以上述方案存在缺陷,那么如何才能让flash像eeprom一样读写,而且操作也不用每次擦除flash呢?...随着page个数的增加,也可以减少擦除的次数,带来的问题是程序设计的更加复杂。...实际使用的过程中每个pages的flag标志不一定只有有效和无效的状态,比如在转移过程中,突然断电了,为了保证数据的不丢失,一定要考虑到每个page异常情况下的状态,并能够恢复数据。
上面的代码中涉及到了泛型,而输出的结果缘由是类型擦除。 1.泛型是什么? 泛型的英文是 generics,较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法。...Sub 是 Base 的子类,不代表 List和 List有继承关系。...回顾文章开始时的那段代码,打印的结果为 true 是因为 List和 List在 jvm 中的 Class 都是 List.class。...(字节码中的descriptor表示返回值,Signature表示泛型信息) 4.类型擦除带来的局限性 利用类型擦除的原理,用反射的手段就绕过了正常开发中编译器不允许的操作限制 当泛型遇见重载 4.1反射...从方法重载的要求来看,看Signature一行,首先把返回值去掉,然后类型擦除,整个Signature就剩下相同的Ljava/util/List,所以以上四个方法都不能共存 但是在class文件格式中