亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Lua中table的遍歷詳解

2024-07-21 23:04:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

當(dāng)我在工作中使用lua進(jìn)行開(kāi)發(fā)時(shí),發(fā)現(xiàn)在lua中有4種方式遍歷一個(gè)table,當(dāng)然,從本質(zhì)上來(lái)說(shuō)其實(shí)都一樣,只是形式不同,這四種方式分別是:

復(fù)制代碼 代碼如下:

for key, value in pairs(tbtest) do 
    XXX 
end
 
for key, value in ipairs(tbtest) do 
    XXX 
end
 
for i=1, #(tbtest) do 
    XXX 
end
 
for i=1, table.maxn(tbtest) do 
    XXX 
end

前兩種是泛型遍歷,后兩種是數(shù)值型遍歷。當(dāng)然你還會(huì)說(shuō)lua的table遍歷還有很多種方法啊,沒(méi)錯(cuò),不過(guò)最常見(jiàn)的這些遍歷確實(shí)有必要弄清楚。

 

這四種方式各有特點(diǎn),由于在工作中我?guī)缀趺刻於紩?huì)使用遍歷table的方法,一開(kāi)始也非常困惑這些方式的不同,一段時(shí)間后才漸漸明白,這里我也是把自己的一點(diǎn)經(jīng)驗(yàn)告訴大家,對(duì)跟我一樣的lua初學(xué)者也許有些幫助(至少當(dāng)初我在寫(xiě)的時(shí)候在網(wǎng)上就找了很久,不知道是因?yàn)榇笈兌颊J(rèn)為這些很簡(jiǎn)單,不需要說(shuō),還是因?yàn)槲冶?,連這都要問(wèn))。

首先要明確一點(diǎn),就是lua中table并非像是C/C++中的數(shù)組一樣是順序存儲(chǔ)的,準(zhǔn)確來(lái)說(shuō)lua中的table更加像是C++中的map,通過(guò)Key對(duì)應(yīng)存儲(chǔ)Value,但是并非順序來(lái)保存key-value對(duì),而是使用了hash的方式,這樣能夠更加快速的訪問(wèn)key對(duì)應(yīng)的value,我們也知道hash表的遍歷需要使用所謂的迭代器來(lái)進(jìn)行,同樣,lua也有自己的迭代器,就是上面4種遍歷方式中的pairs和ipairs遍歷。但是lua同時(shí)提供了按照key來(lái)遍歷的方式(另外兩種,實(shí)質(zhì)上是一種),正式因?yàn)樗峁┝诉@種按key的遍歷,才造成了我一開(kāi)始的困惑,我一度認(rèn)為lua中關(guān)于table的遍歷是按照我table定義key的順序來(lái)的。
下面依次來(lái)講講四種遍歷方式,首先來(lái)看for k,v in pairs(tbtest) do這種方式:
先看效果:

復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
    [4] = 4, 
}
 
for key, value in pairs(tbtest) do 
    print(value) 
end

我認(rèn)為輸出應(yīng)該是1,2,3,4,實(shí)際上的輸出是1,2,4,3。我因?yàn)檫@個(gè)造成了一個(gè)bug,這是后話。

 

也就是說(shuō)for k,v in pairs(tbtest) do 這樣的遍歷順序并非是tbtest中table的排列順序,而是根據(jù)tbtest中key的hash值排列的順序來(lái)遍歷的。

當(dāng)然,同時(shí)lua也提供了按照key的大小順序來(lái)遍歷的,注意,是大小順序,仍然不是key定義的順序,這種遍歷方式就是for k,v in ipairs(tbtest) do。
for k,v in ipairs(tbtest) do 這樣的循環(huán)必須要求tbtest中的key為順序的,而且必須是從1開(kāi)始,ipairs只會(huì)從1開(kāi)始按連續(xù)的key順序遍歷到key不連續(xù)為止。

復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
    [5] = 5, 
}
 
for k,v in ipairs(tbtest) do 
    print(v) 
end

只會(huì)打印1,2,3。而5則不會(huì)顯示。
復(fù)制代碼 代碼如下:

local tbtest = { 
    [2] = 2, 
    [3] = 3, 
    [5] = 5, 
}
 
for k,v in ipairs(tbtest) do 
    print(v) 
end

這樣就一個(gè)都不會(huì)打印。
 
第三種遍歷方式有一種神奇的符號(hào)'#',這個(gè)符號(hào)的作用是是獲取table的長(zhǎng)度,比如:
復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 

print(#(tbtest))

打印的就是3
復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [6] = 6, 

print(#(tbtest))

這樣打印的就是2,而且和table內(nèi)的定義順序沒(méi)有關(guān)系,無(wú)論你是否先定義的key為6的值,‘#'都會(huì)查找key為1的值開(kāi)始。
如果table的定義是這樣的:
復(fù)制代碼 代碼如下:

tbtest = { 
    ["a"] = 1, 
    [2] = 2, 
    [3] = 3, 
}
 
print(#(tbtest))

那么打印的就是0了。因?yàn)?lsquo;#'沒(méi)有找到key為1的值。同樣:
復(fù)制代碼 代碼如下:

tbtest = { 
    [“a”] = 1, 
    [“b”] = 2, 
    [“c”] = 3, 

print(#(tbtest))

打印的也是0
所以,for i=1, #(tbtest) do這種遍歷,只能遍歷當(dāng)tbtest中存在key為1的value時(shí)才會(huì)出現(xiàn)結(jié)果,而且是按照key從1開(kāi)始依次遞增1的順序來(lái)遍歷,找到一個(gè)遞增不是1的時(shí)候就結(jié)束不再遍歷,無(wú)論后面是否仍然是順序的key,比如:

 

table.maxn獲取的只針對(duì)整數(shù)的key,字符串的key是沒(méi)辦法獲取到的,比如:

復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 

print(table.maxn(tbtest))
 
 
tbtest = { 
    [6] = 6, 
    [1] = 1, 
    [2] = 2, 

print(table.maxn(tbtest))

這樣打印的就是3和6,而且和table內(nèi)的定義順序沒(méi)有關(guān)系,無(wú)論你是否先定義的key為6的值,table.maxn都會(huì)獲取整數(shù)型key中的最大值。
如果table的定義是這樣的:
復(fù)制代碼 代碼如下:

tbtest = { 
    ["a"] = 1, 
    [2] = 2, 
    [3] = 3, 

print(table.maxn(tbtest))

那么打印的就是3了。如果table是:
復(fù)制代碼 代碼如下:

tbtest = { 
    [“a”] = 1, 
    [“b”] = 2, 
    [“c”] = 3, 

print(table.maxn(tbtest)) 
print(#(tbtest))

那么打印的就全部是0了。

 

換句話說(shuō),事實(shí)上因?yàn)閘ua中table的構(gòu)造表達(dá)式非常靈活,在同一個(gè)table中,你可以隨意定義各種你想要的內(nèi)容,比如:

復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
    ["a"] = 4, 
    ["b"] = 5, 
}

同時(shí)由于這個(gè)靈活性,你也沒(méi)有辦法獲取整個(gè)table的長(zhǎng)度,其實(shí)在coding的過(guò)程中,你會(huì)發(fā)現(xiàn),你真正想要獲取整個(gè)table長(zhǎng)度的地方幾乎沒(méi)有,你總能采取一種非常巧妙的定義方式,把這種需要獲取整個(gè)table長(zhǎng)度的操作避免掉,比如:
復(fù)制代碼 代碼如下:

tbtest = { 
    tbaaa = { 
        [1] = 1, 
        [2] = 2, 
        [3] = 3, 
    }, 
    ["a"] = 4, 
    ["b"] = 5, 
}

你可能會(huì)驚訝,上面這種table該如何遍歷呢?
復(fù)制代碼 代碼如下:

for k, v in pairs(tbtest) do 
    print(k, v) 
end

輸出是:a 4 b 5 tbaaa table:XXXXX。
由此你可以看到,其實(shí)在table中定義一個(gè)table,這個(gè)table的名字就是key,對(duì)應(yīng)的內(nèi)容其實(shí)是table的地址。
當(dāng)然,如果你用
復(fù)制代碼 代碼如下:

for k, v in ipairs(tbtest) do 
    print(k,v) 
end

來(lái)遍歷的話,就什么都不會(huì)打印,因?yàn)闆](méi)有key為1的值。但當(dāng)你增加一個(gè)key為1的值時(shí),ipairs只會(huì)打印那一個(gè)值,現(xiàn)在你明白ipairs是如何工作的吧。

 

既然這里談到了遍歷,就說(shuō)一下目前看到的幾種針對(duì)table的遍歷方式:

for i=1, #tbtest do --這種方式無(wú)法遍歷所有的元素,因?yàn)?#39;#'只會(huì)獲取tbtest中從key為1開(kāi)始的key連續(xù)的那幾個(gè)元素,如果沒(méi)有key為1,那么這個(gè)循環(huán)將無(wú)法進(jìn)入
for i=1, table.maxn(tbtest) do --這種方式同樣無(wú)法遍歷所有的元素,因?yàn)閠able.maxn只會(huì)獲取key為整數(shù)中最大的那個(gè)數(shù),遍歷的元素其實(shí)是查找tbtest[1]~tbtest[整數(shù)key中最大值],所以,對(duì)于string做key的元素不會(huì)去查找,而且這么查找的效率低下,因?yàn)槿绻阏麛?shù)key中定義的最大的key是10000,然而10000以下的key沒(méi)有幾個(gè),那么這么遍歷會(huì)浪費(fèi)很多時(shí)間,因?yàn)闀?huì)從1開(kāi)始直到10000每一個(gè)元素都會(huì)查找一遍,實(shí)際上大多數(shù)元素都是不存在的,比如:

復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [10000] = 2, 

local count = 0 
for i=1, table.maxn(tbtest) do 
    count = count + 1 
    print(tbtest[i]) 
end 
print(count)

 

你會(huì)看到打印結(jié)果是多么的坑爹,只有1和10000是有意義的,其他的全是nil,而且count是10000。耗時(shí)非常久。一般我不這么遍歷。但是有一種情況下又必須這么遍歷,這個(gè)在我的工作中還真的遇到了,這是后話,等講完了再談。

復(fù)制代碼 代碼如下:

for k, v in pairs(tbtest) do

這個(gè)是唯一一種可以保證遍歷tbtest中每一個(gè)元素的方式,別高興的太早,這種遍歷也有它自身的缺點(diǎn),就是遍歷的順序不是按照tbtest定義的順序來(lái)遍歷的,這個(gè)前面講到過(guò),當(dāng)然,對(duì)于不需要順序遍歷的用法,這個(gè)是唯一可靠的遍歷方式。
復(fù)制代碼 代碼如下:

for k, v in ipairs(tbtest) do

這個(gè)只會(huì)遍歷tbtest中key為整數(shù),而且必須從1開(kāi)始的那些連續(xù)元素,如果沒(méi)有1開(kāi)始的key,那么這個(gè)遍歷是無(wú)效的,我個(gè)人認(rèn)為這種遍歷方式完全可以被改造table和for i=1, #(tbtest) do的方式來(lái)代替,因?yàn)閕pairs的效果和'#'的效果,在遍歷的時(shí)候是類似的,都是按照key的遞增1順序來(lái)遍歷。

 

好,再來(lái)談?wù)劄槭裁次倚枰褂胻able.maxn這種非常浪費(fèi)的方式來(lái)遍歷,在工作中, 我遇到一個(gè)問(wèn)題,就是需要把當(dāng)前的周序,轉(zhuǎn)換成對(duì)應(yīng)的獎(jiǎng)勵(lì),簡(jiǎn)單來(lái)說(shuō),就是從一個(gè)活動(dòng)開(kāi)始算起,每周的獎(jiǎng)勵(lì)都不是固定的,比如1~4周給一種獎(jiǎng)勵(lì),5~8周給另一種獎(jiǎng)勵(lì),或者是一種排名獎(jiǎng)勵(lì),1~8名給一種獎(jiǎng)勵(lì),9~16名給另一種獎(jiǎng)勵(lì),這種情況下,我根據(jù)長(zhǎng)久的C語(yǔ)言的習(xí)慣,會(huì)把table定義成這個(gè)樣子:

復(fù)制代碼 代碼如下:

tbtestAward = { 
    [8] = 1, 
    [16] = 3, 
}

這個(gè)代表,1~8給獎(jiǎng)勵(lì)1,9~16給獎(jiǎng)勵(lì)3。這樣定義的好處是獎(jiǎng)勵(lì)我只需要寫(xiě)一次(這里的獎(jiǎng)勵(lì)用數(shù)字做了簡(jiǎn)化,實(shí)際上獎(jiǎng)勵(lì)也是一個(gè)大的table,里面還有非常復(fù)雜的結(jié)構(gòu))。然后我就遇到一個(gè)問(wèn)題,即我需要根據(jù)周序數(shù),或者是排名序數(shù)來(lái)確定給哪一種獎(jiǎng)勵(lì),比如當(dāng)前周序數(shù)是5,那么我應(yīng)該給我定義好的key為8的那一檔獎(jiǎng)勵(lì),或者當(dāng)前周序數(shù)是15,那么我應(yīng)該給獎(jiǎng)勵(lì)3。由此讀者看出,其實(shí)我定義的key是一個(gè)分界,小于這個(gè)key而大于上一個(gè)key,那么就給這個(gè)key的獎(jiǎng)勵(lì),這就是我判斷的條件。邏輯上沒(méi)有問(wèn)題,但是lua的遍歷方式卻把我狠狠地坑了一把。讀者可以自己想一想我上面介紹的4種遍歷方式,該用哪一種來(lái)實(shí)現(xiàn)我的這種需求呢?這個(gè)函數(shù)的大致框架如下:
復(fù)制代碼 代碼如下:

function GetAward(nSeq) 
    for 遍歷整個(gè)獎(jiǎng)勵(lì)表 do 
        if 滿足key的條件 then 
            return 返回對(duì)應(yīng)獎(jiǎng)勵(lì)的key 
        end 
    end 
    return nil 
end

我也不賣關(guān)子了,分別來(lái)說(shuō)一說(shuō)吧,首先因?yàn)槲业膋ey不是連續(xù)的,而且沒(méi)有key為1的值,所以ipairs和'#'遍歷是沒(méi)用的。這種情況下理想的遍歷貌似是pairs,因?yàn)樗鼤?huì)遍歷我的每一個(gè)元素,但是讀者不要忘記了,pairs遍歷并非是按照我定義的順序來(lái)遍歷,如果我真的使用的條件是:序數(shù)nSeq小于這個(gè)key而大于上一個(gè)key,那么就返回這個(gè)key。那么我無(wú)法保證程序執(zhí)行的正確性,因?yàn)閗ey的順序有可能是亂的,也就是有可能先遍歷到的是key為16的值,然后才是key為8的值。
這么看來(lái)我只剩下table.maxn這么一種方式了,于是我寫(xiě)下了這種代碼:
復(fù)制代碼 代碼如下:

for i=1, table.maxn(tbtestAward) do 
    if tbtestAward[i] ~= nil then 
        if nSeq <= i then 
            return i 
        end 
    end 
end 

 

這么寫(xiě)效率確實(shí)低下,因?yàn)閷?shí)際上還是遍歷了從key為1開(kāi)始直到key為table.maxn中間的每一個(gè)值,不過(guò)能夠滿足我上面的要求。當(dāng)時(shí)我是這么實(shí)現(xiàn)的,因?yàn)檫@個(gè)獎(jiǎng)勵(lì)表會(huì)不斷的發(fā)生變化,這樣我每次修改只需要修改這個(gè)獎(jiǎng)勵(lì)表就能夠滿足要求了,后來(lái)我想了想,覺(jué)得其實(shí)我如果自己再定義一個(gè)序數(shù)轉(zhuǎn)換成對(duì)應(yīng)的獎(jiǎng)勵(lì)數(shù)種類的表就可以避免這種坑爹的操作了,不過(guò)如果獎(jiǎng)勵(lì)發(fā)生修改,我需要統(tǒng)一排查的地方就不止這個(gè)獎(jiǎng)勵(lì)表了,權(quán)衡再三,我還是沒(méi)有改,就這么寫(xiě)了。沒(méi)辦法,不斷變化的需求已經(jīng)把我磨練的忘記了程序的最高理想。我甚至愿意犧牲算法的效率而去追求改動(dòng)的穩(wěn)定性。在此哀悼程序員的無(wú)奈。我這種時(shí)間換空間的做法確實(shí)不知道好不好。

后來(lái)我在《Programming In Lua》中看到了一個(gè)神奇的迭代器,使用它就可以達(dá)到我想要的這種遍歷方式,而且不需要去遍歷那些不存在的key。它的方法是把你所需要遍歷的table里的key按照遍歷順序放到另一個(gè)臨時(shí)的table中去,這樣只需要遍歷這個(gè)臨時(shí)的table按順序取出原table中的key就可以了。如下:

首先定義一個(gè)迭代器:

復(fù)制代碼 代碼如下:

function pairsByKeys(t) 
    local a = {} 
    for n in pairs(t) do 
        a[#a+1] = n 
    end 
    table.sort(a) 
    local i = 0 
    return function() 
        i = i + 1 
        return a[i], t[a[i]] 
    end 
end

然后在遍歷的時(shí)候使用這個(gè)迭代器就可以了,table同上,遍歷如下:
復(fù)制代碼 代碼如下:

for key, value in pairsByKeys(tbtestAward) do 
    if nSeq <= key then 
        return key 
    end 
end

并且后來(lái)我發(fā)現(xiàn)有了這個(gè)迭代器,我根本不需要先做一步獲取是哪一檔次的獎(jiǎng)勵(lì)的操作,直接使用這個(gè)迭代器進(jìn)行發(fā)獎(jiǎng)就可以了。大師就是大師,我怎么就沒(méi)想到呢!
還有些話我還沒(méi)有說(shuō),比如上面數(shù)值型遍歷也并非是像看起來(lái)那樣進(jìn)行遍歷的,比如下面的遍歷:
復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
    [5] = 5, 
}
 
for i=1, #(tbtest) do 
    print(tbtest[i]) 
end

打印的順序是:1,2,3。不會(huì)打印5,因?yàn)?已經(jīng)不在table的數(shù)組數(shù)據(jù)塊中了,我估計(jì)是被放到了hash數(shù)據(jù)塊中,但是當(dāng)我修改其中的一些key時(shí),比如:
復(fù)制代碼 代碼如下:

tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [4] = 4, 
    [5] = 5, 
}
 
for i=1, #(tbtest) do 
    print(tbtest[i]) 
end

打印的內(nèi)容卻是:1,2,nil,4,5。這個(gè)地方又遍歷到了中間沒(méi)有的key值,并且還能繼續(xù)遍歷下去。我最近正在看lua源碼中table的實(shí)現(xiàn)部分,已經(jīng)明白了是怎么回事,不過(guò)我想等我能夠更加清晰的闡述lua中table的實(shí)現(xiàn)過(guò)程了再向大家介紹。用我?guī)煾档脑捳f(shuō)就是不要使用一些未定義的行為方法,避免在工作中出錯(cuò),不過(guò)工作外,我還是希望能明白未定義的行為中那些必然性,o(︶︿︶)o 唉!因果論的孩子傷不起。等我下一篇博文分析lua源碼中table的實(shí)現(xiàn)就能夠更加清晰的說(shuō)明這些了。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
精品一级毛片| 欧美视频日韩| 免费看黄资源大全高清| 欧美激情免费看| 国产一区 在线播放| 91产国在线观看动作片喷水| 性欧美18一19性猛交| 亚洲精品自拍| 麻豆久久久久| 亚洲热线99精品视频| 三级av在线播放| 国产日产精品一区二区三区四区| 性猛交富婆╳xxx乱大交天津| 亚洲国产精品影院| 在线视频日本亚洲性| 这里只有精品视频| 青青草一区二区三区| 男人插女人下面免费视频| 涩爱av色老久久精品偷偷鲁| 神马午夜伦理不卡| 久草青青在线观看| 日韩av片网站| 丝袜亚洲另类丝袜在线| 国产污视频在线播放| 北条麻妃一区二区三区| 95影院理论片在线观看| 成人欧美一区二区三区在线| 自拍偷拍亚洲精品| 国产欧美精品一区二区色综合| 国产欧美日韩综合精品二区| 国产精品99久久久久久久久| 欧美一区二区三区在线电影| 看欧美日韩国产| 麻豆国产精品777777在线| 国产精品麻豆免费版现看视频| 国产免费高清一区| 中文字幕永久在线| 你懂的国产视频| 一区二区三区黄色| 日本视频一区二区三区| 懂色av中文字幕一区二区三区| 天天色综合社区| 一级女性全黄久久生活片免费| 欧洲毛片在线视频免费观看| 欧美精品乱码久久久久久按摩| 欧美成人精品福利在线视频| 男人天堂va| 精品剧情v国产在线观看在线| 欧美va亚洲va日韩∨a综合色| 黄页网址大全在线观看| 亚洲a一区二区| 蜜乳av中文字幕| 澳门黄色一级片| 高潮一区二区三区| 久久全国免费久久青青小草| 色综合伊人色综合网站| 亚洲丝袜制服诱惑| 国产精品精品软件视频| 国产69精品久久久久毛片| 一级成人免费视频| 色狠狠色狠狠综合| 国产免费拔擦拔擦8x在线播放| 国产精品99久久久久久白浆小说| 成人av二区| 亚洲啪啪av| 亚洲国产成人综合| 国产乱子夫妻xx黑人xyx真爽| 超碰av在线免费观看| 国产精品日韩精品| 亚洲人妻一区二区三区| 免费 成 人 黄 色| 1769在线观看| 日韩一级视频免费观看在线| 成人黄色小视频在线观看| 亚洲乱码国产乱码精品精软件| 一本大道久久a久久精二百| caoporn国产一区二区| 在线丨暗呦小u女国产精品| 精品国产免费第一区二区| 高清视频欧美一级| 精品国产三区在线| 亚洲社区在线观看| 欧美日韩黑人| 欧美精品成人一区二区三区四区| 免费观看日批视频| 欧美在线视频网站| 国产伦精品一区二区三区高清版禁| 成人在线精品| 免费视频最近日韩| 国产卡一卡二卡三| 亚洲免费观看在线视频| 欧美日韩在线精品一区二区三区激情综| 亚洲视频一区二区免费在线观看| 欧美日韩综合一区二区三区| 日批在线观看视频| 亚洲第一视频区| 奇米4444一区二区三区| 天天干天天av| 中文字幕日韩综合| 中文字幕免费在线看线人动作大片| 亚洲国产精品人人爽夜夜爽| 国产精品一二一区| 激情综合在线观看| 一本久道久久综合中文字幕| 国产wwwxxx| 国产一区二区三区视频在线| 久久久国产一区二区| 久久亚洲图片| 久草视频观看| 日韩欧美成人一区二区三区| www.-级毛片线天内射视视| 亚洲一二三区视频| 色欧美在线观看| 鲁丝一区二区三区免费| 久久久久网站| 亚洲一区二区成人在线观看| 一区二区三区四区视频精品免费| 91女神在线视频| 日韩一区二区在线| 久久午夜视频| 亚洲精品网址在线观看| www.玖玖玖| 国产suv一区二区三区88区| 成人av免费在线播放| 麻豆视频在线免费观看| 99这里只有久久精品视频| 欧美肉大捧一进一出免费视频| 无码国产精品一区二区免费式直播| 中文字幕在线网址| 国产成人久久精品一区二区三区| 欧美电影在线观看网站| 97精品资源在线观看| 日韩高清不卡一区| 2019中文字幕在线电影免费| 91.·福利| 一区二区在线免费播放| 久久国产精品久久久久久电车| 69xx绿帽三人行| 日本美女久久久| 99久久久无码国产精品性| 理论片午夜视频在线观看| 欧美一卡2卡3卡4卡无卡免费观看水多多| 波多野结衣午夜| jlzzjlzz亚洲女人18| 久久米奇亚洲| 在线播放亚洲一区| 影音先锋男人在线| 欧美r片在线| 亚洲免费av片| 性欧美长视频免费观看不卡| 激情视频免费观看在线| 亚洲一区二区三区精品在线| 亚洲高清在线一区| 免费av一区二区三区四区| 精品国语对白精品自拍视| 欧美成年黄网站色视频| 亚州国产精品| 日韩成人黄色| 91精品视频免费看| 综合欧美一区二区三区| a天堂在线资源| a视频免费观看| 中文字幕亚洲精品乱码| 国产在线观看不卡一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 91精品久久久久久久久久另类| 国产综合色一区二区三区| 久久一日本道色综合| 国产精品日韩久久久| 亚洲人成电影在线| 免费av观看网址| 男女羞羞视频网站| 国产一区二区视频免费观看| 亚洲精品久久久久久久久久久久久| 99久久国产免费| 成人性生交大片免费看中文网站| 99久久国产综合精品女小说| 成年人国产精品| 女人色在线免费视频| 欧美乱大交xxxxx潮喷l头像| 国产精品久久久久久久岛一牛影视| 国产精品久久久久桃色tv| 国内精品伊人久久久久影院对白| 色天天久久综合婷婷女18| 97人人做人人爽香蕉精品| 永久免费精品视频| 国产av无码专区亚洲av麻豆| 24小时成人在线视频| 欧美v日韩v国产v| 一本大道久久精品| 在线观看成人免费| 欧洲亚洲精品| 欧美日韩电影在线播放| 看片的网站亚洲| 99在线小视频| 国产专区在线视频| 国产不卡一区| 国产一区二区视频网站| 综合国产精品久久久| 在线观看黄色网| 美国一级片在线观看| 一区二区三区在线免费观看视频| 日本精品一区二区三区四区| 97国产真实伦对白精彩视频8| 欧美丰满老妇厨房牲生活| 国产精品视频白浆免费视频| 国产v亚洲v天堂无码久久久| 9l视频自拍蝌蚪9l视频| 欧洲三级视频| 搡女人真爽免费午夜网站| 国产深夜视频在线观看| 色在线视频播放| 少妇人妻偷人精品一区二区| 蜜桃视频无码区在线观看| 国产成人精品av在线观| 成人性片免费| 中文字幕在线不卡一区二区三区| 乱h高h女3p含苞待放| 欧美xfplay| 色呦呦在线播放| 免费毛片小视频| 在线观看日韩一区| 国产精品三级电影| 亚洲成人精品久久| 成人免费在线观看视频网站| 国产女人免费看a级丨片| 日韩电影免费在线观看| 日韩在线观看高清| 国产成人免费在线观看不卡| 久久午夜a级毛片| 成人精品美女隐私视频| 欧美日韩视频网站| 麻豆freexxxx性91精品| 亚洲精品国产成人av在线| 成人eeuss影院在线观看| 亚洲成人1区2区| 3p乱日视频| 亚洲福利一区二区| 久久精品国产一区二区三区免费看| 四虎成人免费视频| 青青草原在线免费观看视频| www.国产com| 91狠狠综合久久久| 欧美少妇一区二区三区| 中文字幕成人免费视频| 欧美xxx黑人xxx水蜜桃| 国产精品视频首页| 亚洲aa在线观看| 亚洲午夜福利在线观看| 久久久久久久高清| 99er热精品视频| 91超碰caoporn97人人| 懂色av懂色av粉嫩av| 中文字幕在线直播| 欧美日韩调教| 欧美成人激情视频免费观看| 日本a级片在线观看| 91老师片黄在线观看| 久久激情五月激情| 日韩大片免费在线观看| 国产精自产拍久久久久久蜜| 青檬在线电视剧在线观看| 日韩精品看片| 好吊妞视频一区二区三区| 久久影院免费观看| 亚洲热在线观看| 久草视频免费在线播放| 91福利视频在线观看| 日本福利片在线观看| 爱啪视频在线观看视频免费| 少妇特黄一区二区三区| 国内外成人免费激情在线视频| 福利影院在线看| 热久久视久久精品18亚洲精品| 国内精品久久久久久影院老狼| 黄色片视频免费观看| 欧美精品videofree1080p| 97人人模人人爽人人喊中文字| av漫画网站在线观看| 91看片免费版| 人人干人人视频| 国产亚洲精品美女久久久| 亚洲第一精品在线观看| 欧美三日本三级少妇三99| 国产麻豆剧果冻传媒视频杜鹃| 亚洲欧美卡通另类91av| 一级毛片免费看| japanese23hdxxxx日韩| 69av视频在线播放| 日本一道本久久| 亚洲精品免费在线观看视频| av激情成人网| 国产一区二区不卡老阿姨| 精品久久网站| 性欧美疯狂猛交69hd| 白白在线精品| 91社区在线观看播放| 久久97精品久久久久久久不卡| 视频国产精品| 青青国产在线观看| 欧美精品xxx| 成人av在线资源网| 最近中文字幕免费mv2018在线| 伊人免费视频2| 45www国产精品网站| 136福利视频导航| 国产日韩视频在线播放| 精品久久久久久一区二区里番| 成人午夜短视频| 日韩欧美一区二区一幕| 亚洲精品成人无限看| 欧美国产精品va在线观看| www.99re7| 成人看片爽爽爽| 欧美日韩激情一区| 国产精品2024| 日韩精品一区二区av| 在线视频中文字幕| 黄色一级片免费的| 精品国产第一页| 国产成人亚洲综合a∨猫咪| 香蕉自在线视频| 国产欧美一区二区色老头| 亚洲一区在线不卡| 精品国内自产拍在线视频| 波多野结衣一区二区三区| 一道精品视频一区二区三区男同| 国产一级黄色电影|