stl的容器库常用模式就是将容器、迭代器和算法的进行分离,容器专于存储,迭代器负责枚举,这样互相独立好处多多。
因此TBOX也借鉴了这种模式,不同的是没用模板,仅仅用了c语言来实现。容器库里面的大部分容器都是继承自迭代器的,所以迭代起来相当的方便。
下面先看个迭代器使用的例子:
继续阅读 »
迭代器模式是指提供一种方法,顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心内部构造,也可以按顺序访问其中的每个元素。
jQuery中的迭代器
迭代器模式无非就是循环访问聚合对象中的各个元素。比如jQuery中的$.each函数,其中回调函数中的i为当前 索引,n为当前元素,代码如下
$.each([1, 2, 3], function(i, n) {
console.log('当前坐标:' + i);
console.log('当前值:' + n);
});
然而,作为一个合格的前端开发者,我们不应该只是会用,而
继续阅读 »
"可迭代对象"与"迭代器"
Python中迭代器指的是实现了__iter__协议与next()方法的对象,其中__iter__协议中返回对象自身(self),next()方法每次返回单一元素,直至所有元素遍历结束,抛出'StopIteration'异常结束。
可迭代对象是一种更宽泛的定义,只要对象实现了__iter__协议,返回一个迭代器(并不像迭代器一样必须返回自身self)用来遍历自己的元素集合,那这个对象就是可迭代的对象,也意味着可以直接通过for item in obj...的方式遍历。
iter(a) is iter(a)?
>>a = [1, 2, 3]
>>iter(a) is iter(a) #(1)
>>F
继续阅读 »
本文是「Java 8 函数式编程」第三章的读书笔记,章名为流。本章主要介绍了外部迭代与内部迭代以及常用的高阶函数。
外部迭代与内部迭代
外部迭代
过去我们要对一个List进行迭代时,往往会采用如下方式:
java
int count = 0;
for (Artist artist : artists) {
if (artist.isFrom("London")) {
count++;
}
}
继续阅读 »
forEach
今天从 forEach 开始谈谈迭代吧。
forEach 作为一个比较出众的遍历操作,之前有很多库都对其进行过各种包装,然而我还是发现很多人并不是非常理解 forEach。
比如第二个参数 this 的使用。
继续阅读 »
TBOX提供了各种常用算法,对容器中的元素进行各种操作,这里主要介绍下排序和查找算法。
排序算法目前支持如下几种:
快速排序:tb_quick_sort
堆排序: tb_heap_sort
插入排序:tb_insert_sort
冒泡排序:tb_bubble_sort
并且提供通用的tb_sort接口,对各种排序算法进行自动适配,使得任何情况下,性能都是最优的。
例如:
对具有随机迭代特性的容器,采用快速排序来优化
对具有随机迭代特性,并且是超大规模的容器,采用堆排序
对只能线性迭代的容器采用冒泡排序
继续阅读 »
1. 迭代器模式
提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。迭代器模式的结构:
抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方
继续阅读 »
训练阶段我们采用了分批处理,可以优化部分内存。
原先我们的代码使用一次性载入数据,然后开始若干次迭代,直至收敛。这样保存image与shape的数据矩阵Data就一直占用内存,但实际上,数据集的image与shape 的作用仅仅是计算$\Delta X$和$\Phi$,两变量的定义参考《 Supervised Descent Method and its Applications to Face Alignment》,其实也就是init shape与true shape的差值以及init shape的特征向量。计算完了,Data就没用了。于是我们设想分批处理,每次迭代载入一次数据,用完了就clear。这样就需要载入多次,可能时间上
继续阅读 »
以下内容是基于HashMap源码注视的翻译
Hash表是基于Map接口的实现,这种实现提供了所有原始map的操作,允许null value和null key。
HashMap类大致相当于HashTable,只是它是不同步,并允许使用空值。
此类对map秩序的维护不做任何保证;尤其是,它并不保证顺序随着时间的推移,将保持恒定。
此实现提供常数时间复杂度的get和put操作,假设散列函数妥善分散桶与桶之间的元素。
迭代集合视图需要的时间复杂度与HashMap实例 的 "capacity"(存储桶的数目)再加上它的key-value 映射的数量 成正比,
因此如果迭代性能重要的话,非常重要的事情是一定不要把Map的初始容量设置得太高或
继续阅读 »
专精专业和冗余流程的管理应该在什么时候把握平衡
在写程序和架构的过程中,经常会面临到底是以快速实现功能为目标取向的单点服务系统,还是在开始设计架构和功能的时候就考虑周全的分布式具有冗余的系统架构。 以技术角度看,得出合理的结论并不是特别难。在前期快速产品迭代争取竞争优势的时期,只要能保证基本的稳定性,当然是怎么快怎么来,单点未必就不是最佳选择。
继续阅读 »