lua库函数table.pack:
table.pack(...)
table.pack的目的是返回所有参数以键填充的新表,并将"n"这个域设置为参数的总数。注意,因为是按参数的逆序填充参数,所以导致这张返回的表不一定是一个序列。 table.pack的具体实现是C函数pack,接下来对pack进行分析。
对pack进行注解:
static int pack (lua_State *L) {
int i;
// 获取参数数量n
int n = lua_gettop(L); /* number of elements to pack */
// 创建一个表,并且重设其大小
lua_createtable(L, n, 1); /* create result table */
// 将这个表插入到 index 1
lua_insert(L, 1); /* put it at index 1 */
// 将所有参数按倒序依次放入表中
// 因为这里是按倒序将参数放入表中
// 所以pack返回的表不一定是一个序列
for (i = n; i >= 1; i--) { /* assign elements */
lua_seti(L, 1, i);
}
// 往栈上压入n
lua_pushinteger(L, n);
// 在表中设置t["n"]=n
lua_setfield(L, 1, "n"); /* t.n = number of elements */
// 返回1表明,pack只有一个返回值
return 1; /* return table */
}
pack的实现是比较简单的。现在对pack的时间复杂度和空间复杂度进行分析:
pack除for循环外,均是常量时间操作;for循环内部的lua_seti()也可认为是常量时间操作;所以pack的时间复杂度是: $$ O(n) $$
pack会在创建表时,设置其大小;最后会新增一个"n"域;表的大小是和参数数量成正比的;pack的空间复杂度是: $$ O(n) $$