how to delete all elements in a Lua table?

后端 未结 5 841
长发绾君心
长发绾君心 2021-02-04 00:06

How do I delete all elements inside a Lua table? I don\'t want to do:

t = {}
table.insert(t, 1)
t = {}  -- this assigns a new pointer to t

I w

相关标签:
5条回答
  • 2021-02-04 00:38

    easiest and most performant:

    for k,v in pairs(tab) do tab[k]=nil end
    

    What you suggest isn't usable: table.remove shifts the remaining elements to close the hole, and thus messes up the table traversal. See the description for the next function for more info

    0 讨论(0)
  • 2021-02-04 00:43

    Table elements insert and remove performance compare

    The Table size count 10000000

    [1] while and rawset

    while #t ~= 0 do rawset(t, #t, nil) end
    

    spent time = 0.677220

    [2] next and rawset

    for k in next, t do rawset(t, k, nil) end
    

    spent time = 0.344533

    [3] ipairs and rawset

    for i, v in ipairs(t) do t[i] = nil end
    

    spent time = 0.012450

    [4] for, rawset

    count = #t
    for i=0, count do t[i]=nil end
    

    spent time = 0.009308

    Table elemnets insert

    [1] table insert function

    for i=0, 10000000 do    table.insert(t, i, i) end
    

    spent time = 1.0590489

    [2] use #t

    for i=0, 10000000 do    t[#t+1] = i end
    

    spent time = 0.703731

    [3] for, rawset

    for i=0, 10000000 do rawset(t, i, i) end
    

    spent time = 0.100010

    result.

    Fastest remove : 4

    Fastest insert : 3

    0 讨论(0)
  • 2021-02-04 00:47
    for k in pairs (t) do
        t [k] = nil
    end
    

    Will also work - you may have difficulty with ipairs if the table isn't used as an array throughout.

    0 讨论(0)
  • 2021-02-04 00:56

    For a faster version that ignores the __pairs metamethod:

    local next = next
    local k = next(tab)
    while k ~= nil do
      tab[k] = nil
      k = next(tab, k)
    end
    

    EDIT: As @siffiejoe mentions in the comments, this can be simplified back into a for loop by replacing the pairs call with its default return value for tables: the next method and the table itself. Additionally, to avoid all metamethods, use the rawset method for table index assignment:

    for k in next, tab do rawset(tab, k, nil) end
    
    0 讨论(0)
  • 2021-02-04 01:03

    #table is the table size and so if t = {1,2,3} then #t = 3

    So you can use this code to remove the elements

    while #t ~= 0 do rawset(t, #t, nil) end

    You will go through the table and remove each element and you get an empty table in the end.

    0 讨论(0)
提交回复
热议问题