免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

C++ split() 字符串分割的五種實現(xiàn)與性能實測

C++ split() 字符串分割的五種實現(xiàn)與性能實測 最近在做一個跨平臺的消息中間件需要頻繁解析配置文件里的鍵值對和標(biāo)志位列表形如key1value1;flag1;flag2hello world這種格式。按常規(guī)思路第一反應(yīng)是去找std::string有沒有現(xiàn)成的split()接口。翻了一圈標(biāo)準(zhǔn)庫答案是沒有。C 就是這么有個性它把“怎么拆字符串”這個問題完全留給開發(fā)者自己解決。于是我又一次老老實實地自己寫了一個split()順便把這幾年的心得整理成這篇文章。這篇文章不打算講太高深的東西主要圍繞“C 實現(xiàn)字符串分割函數(shù) split()”這件事把我實際用過的方案、踩過的坑、性能實測數(shù)據(jù)以及最終沉淀下來的工程級實現(xiàn)都寫清楚。如果你正在處理配置解析、日志清洗、命令行參數(shù)拆分這類需求這篇文章可以直接當(dāng)參考。1. 這件事的起點為什么需要自己寫 split1.1 項目里的真實需求場景我遇到的場景很典型一個配置項是一個長字符串由分號分隔多個子項每個子項內(nèi)部可能又是keyvalue結(jié)構(gòu)。如果 C 標(biāo)準(zhǔn)庫自帶了 split代碼大概會寫成auto items split(config_str, ;); for (auto item : items) { auto kv split(item, ); // ... }但標(biāo)準(zhǔn)庫沒給這個接口所以上面這段代碼在 C 里無法直接編譯必須自己定義一個 split。這類需求在 C 項目里出現(xiàn)的頻率非常高不只是配置解析像網(wǎng)絡(luò)協(xié)議的自定義報文分割、命令行參數(shù)的解析、CSV 格式的簡易解析全都繞不開“把字符串按某個分隔符拆開”這個基礎(chǔ)操作。有人可能會說用 Python 或者腳本語言干這活多簡單C 的字符串處理就是笨重。這話有一定道理但在要求高性能、低延遲或需要嵌入到客戶端 SDK 的場景里C 依然是主力語言字符串拆分這種高頻基礎(chǔ)操作只能自己造輪子。作為一個合格的 C 開發(fā)者手寫一個健壯的 split 是基本功。1.2 標(biāo)準(zhǔn)庫為什么一直沒加 split很多人好奇C 標(biāo)準(zhǔn)庫為什么這么多年都不提供 split原因主要有三個。第一標(biāo)準(zhǔn)庫的設(shè)計哲學(xué)是“提供最小但通用的構(gòu)件”而不是把每個功能都封裝成現(xiàn)成函數(shù)。std::string::find、std::string::substr、std::istringstream、std::getline、std::regex這些已經(jīng)覆蓋了拆分的全部能力標(biāo)準(zhǔn)委員會認(rèn)為你再組合一下就能得到 split不需要單獨提供。第二split 本身存在太多變體。返回值怎么定是vectorstring還是vectorstring_view分隔符是單個字符還是字符串要不要支持多個分隔符空字符串是保留還是丟棄首尾分隔符怎么處理這些語義沒有統(tǒng)一答案標(biāo)準(zhǔn)庫一旦提供某一種就會限制其他用法的發(fā)揮。第三歷史包袱。C 標(biāo)準(zhǔn)庫演進(jìn)極其謹(jǐn)慎任何新接口都必須在多個委員會會議里反復(fù)打磨像 split 這種“一百個人有一百種接口定義”的功能優(yōu)先級排得很低以至于 C23 才出現(xiàn)了相對可用的 ranges 方案。1.3 設(shè)計 split 前必須先想清楚的幾個問題寫 split 很簡單寫一個“好用且不坑”的 split 卻需要先回答幾個問題。返回值選vectorstring還是vectorstring_view這直接關(guān)系到性能。vectorstring每個元素都是一次堆分配數(shù)據(jù)量大時開銷明顯vectorstring_view則只是原字符串上的視圖零拷貝但代價是要求源字符串在視圖生命周期內(nèi)保持有效而且切割后無法直接修改每個元素的內(nèi)容??沾呗砸埠荜P(guān)鍵。按a,,b中逗號拆分標(biāo)準(zhǔn)做法應(yīng)該得到[a, , b]還是[a, b]不同項目訴求完全不同解析 CSV 可能希望保留空字段解析配置文件可能恨不得把空串全扔掉。分隔符支持單個字符還是任意字符串是否支持多個分隔符這決定了一個函數(shù)是只能處理split(str, ,)還是能處理split(str, ,;\t)這種多分隔符場景。這些決策必須在一開始就定下來否則后面返工很痛苦。2. 五種主流實現(xiàn)方案的橫向?qū)Ρ?.1 思路一基于 getline 的流式拆分這是最容易被想到的方案利用std::istringstream加std::getline的重載以指定字符作為行分隔符#include sstream #include string #include vector std::vectorstd::string splitByGetline(const std::string s, char delim) { std::vectorstd::string tokens; std::istringstream iss(s); std::string token; while (std::getline(iss, token, delim)) { tokens.push_back(token); } return tokens; }這個實現(xiàn)的優(yōu)點是代碼極短邏輯直白不容易寫錯。但隱藏問題不少std::getline不會保留空串如果輸入是a,,b得到的是[a, b]中間的空字段丟了其次它有兩個failbit相關(guān)的坑當(dāng)字符串結(jié)尾正好是分隔符時最后一個空子串不會輸出再者一律假設(shè)輸入以文本行形式存在遇到\0之類的字符時行為會變得微妙。實測下來這個方案的性能在中規(guī)中矩的級別因為istringstream內(nèi)部有 locale 處理和流緩沖機制相比直接find要慢不少。它適合邏輯簡單、不在乎性能、并且明確知道不需要保留空串的場景比如按空格拆分用戶輸入的命令行單詞。2.2 思路二find 加 substr 手工切割這是最經(jīng)典的手工方案也是我在生產(chǎn)環(huán)境最常用的基礎(chǔ)版本#include string #include vector std::vectorstd::string splitByFind(const std::string s, const std::string delim) { std::vectorstd::string tokens; if (delim.empty()) { tokens.push_back(s); return tokens; } size_t start 0; size_t pos 0; while ((pos s.find(delim, start)) ! std::string::npos) { tokens.push_back(s.substr(start, pos - start)); start pos delim.size(); } tokens.push_back(s.substr(start)); return tokens; }這個方案能正確處理多字符分隔符比如按-拆分a-b-c這是 getline 方案做不到的。同時它天然保留空字段輸入a,,b按,拆分得到[a, , b]。性能方面比 getline 好不少因為少了流對象的構(gòu)造和 locale 開銷只調(diào)用find和substr。缺點是每次substr都會產(chǎn)生新的字符串拷貝如果被分割的字符串很長、次數(shù)很多內(nèi)存分配壓力會顯現(xiàn)。可以在循環(huán)前tokens.reserve(...)預(yù)留容量也可以換成string_view版本進(jìn)一步降低拷貝。2.3 思路三正則表達(dá)式統(tǒng)一切割正則方案可以優(yōu)雅地處理復(fù)雜分隔符比如同時按逗號、分號、空白分割還能支持變長空白#include regex #include string #include vector std::vectorstd::string splitByRegex(const std::string s, const std::string pattern) { std::regex re(pattern); std::sregex_token_iterator begin(s.begin(), s.end(), re, -1); std::sregex_token_iterator end; return std::vectorstd::string(begin, end); }調(diào)用方式變成splitByRegex(a,b;c d, [,;\\s])相當(dāng)靈活。std::sregex_token_iterator配合-1表示“匹配模式之外的片段”這個用法是最容易踩坑的地方很多人寫成0結(jié)果拿到的是分隔符本身而不是分割結(jié)果。正則方案最大的代價是性能。std::regex的構(gòu)造和匹配開銷非常大實測用正則做一次簡單拆分比find版本慢十倍甚至幾十倍都很正常。所以我的建議是能用find就別用正則只有分隔符確實是復(fù)雜語境時才值得上正則而且最好把std::regex對象緩存起來復(fù)用不要每次調(diào)用都重新構(gòu)造。2.4 思路四C23 ranges 的 split_view如果你的編譯器已經(jīng)支持 C23標(biāo)準(zhǔn)庫終于提供了std::ranges::views::split這算是從語言層面補上了 split 的缺失#include ranges #include string #include vector std::vectorstd::string splitCxx23(const std::string s, char delim) { std::vectorstd::string tokens; for (auto part : s | std::views::split(delim)) { tokens.emplace_back(part.begin(), part.end()); } return tokens; }這段代碼在 C23 模式下編譯語義很清晰“把 s 按 delim 切分成若干部分”。它的底層采用惰性求值遍歷過程不會一次性生成所有拷貝內(nèi)存占用更友好。但也要注意早期實現(xiàn)里split_view得到的每個子范圍不是直接能當(dāng)std::string用的類型需要手動用std::string(part.begin(), part.end())構(gòu)造這點和 Python 的split()完全不同初學(xué)者容易懵。2.5 方案對比一覽我用幾組典型場景做了一個橫向?qū)Ρ确奖隳惆错椖吭V求選型。方案保留空串多字符分隔符多分隔符性能量級代碼復(fù)雜度適用場景getline 流式否否否中極低簡單命令行拆分find substr是是否高低通用場景首選find 多分隔符輔助可配置是是高中生產(chǎn)環(huán)境推薦std::regex是是是極低中復(fù)雜分隔規(guī)則C23 split_view是否否中高低新項目嘗鮮從這張表能看出find substr在大多數(shù)情況下都是性價比最高的方案它兼顧了語義靈活性和性能。我的建議是先把這一版吃透再根據(jù)需求擴展成多分隔符版本這樣能應(yīng)付絕大部分工程場景。3. 工程級 split 的完整設(shè)計與實現(xiàn)3.1 接口設(shè)計能干活但別挖坑寫一個能上生產(chǎn)環(huán)境的 split我不會只提供一個單薄的重載。經(jīng)過多次迭代現(xiàn)在一般提供下面幾組接口namespace StrUtils { // 基礎(chǔ)版本按單個字符拆分 std::vectorstd::string split(const std::string s, char delim); // 按多字符字符串拆分 std::vectorstd::string split(const std::string s, const std::string delim); // 按一組分隔字符拆分分隔符集合中的任意字符都算分隔符 std::vectorstd::string splitAny(const std::string s, const std::string delims); // 高級版本支持保留空串策略和前后修剪策略 std::vectorstd::string split(const std::string s, const std::string delim, bool keepEmpty, bool trim); }接口設(shè)計的關(guān)鍵是保持一致性。split(s, ,)應(yīng)該和split(s, std::string(,))行為完全一致不能因為入?yún)㈩愋筒煌瑢?dǎo)致空串處理策略不同否則調(diào)用方會被這種“隱式差異”坑得很慘。另外我把keepEmpty和trim默認(rèn)值都設(shè)置成符合直覺的狀態(tài)keepEmpty false表示默認(rèn)丟棄空串trim true表示默認(rèn)修剪首尾空白這樣配置解析場景里最常見的寫法可以保持干凈。3.2 核心實現(xiàn)find 加 substr 的強化版多字符分隔符的基礎(chǔ)版本在前面已經(jīng)展示過了這里直接給出高級版本的完整實現(xiàn)這是我在多個項目里反復(fù)打磨后的形態(tài)#include algorithm #include cctype #include string #include vector namespace StrUtils { static inline std::string trim_copy(const std::string s) { size_t begin 0; size_t end s.size(); while (begin end std::isspace(static_castunsigned char(s[begin]))) { begin; } while (end begin std::isspace(static_castunsigned char(s[end - 1]))) { --end; } return s.substr(begin, end - begin); } std::vectorstd::string split(const std::string s, const std::string delim, bool keepEmpty, bool trim) { std::vectorstd::string tokens; if (delim.empty()) { tokens.push_back(trim ? trim_copy(s) : s); return tokens; } const size_t delimLen delim.size(); size_t start 0; size_t pos 0; while ((pos s.find(delim, start)) ! std::string::npos) { std::string token s.substr(start, pos - start); if (trim) token trim_copy(token); if (keepEmpty || !token.empty()) { tokens.push_back(std::move(token)); } start pos delimLen; } // 處理最后一段 std::string tail s.substr(start); if (trim) tail trim_copy(tail); if (keepEmpty || !tail.empty()) { tokens.push_back(std::move(tail)); } return tokens; } std::vectorstd::string splitAny(const std::string s, const std::string delims) { std::vectorstd::string tokens; if (delims.empty()) { tokens.push_back(s); return tokens; } size_t start 0; size_t pos 0; while ((pos s.find_first_of(delims, start)) ! std::string::npos) { tokens.push_back(s.substr(start, pos - start)); start pos 1; } tokens.push_back(s.substr(start)); return tokens; } }這個實現(xiàn)有幾個細(xì)節(jié)值得說明。s.find(delim, start)返回的pos是分隔符起點所以截取子串的終點是pos下一個查找起點必須跳過整個分隔符長度即start pos delimLen。如果分隔符是多字節(jié)字符串這個邏輯依然正確如果分隔符是單個字符delimLen就是 1。trim_copy里我特意用了static_castunsigned char(s[begin])這是為了防止char在高位為 1 時比如 UTF-8 中文的某個字節(jié)被std::isspace當(dāng)作負(fù)數(shù)處理。不轉(zhuǎn)會讓程序在某些編譯器上出現(xiàn)未定義行為。std::isspace的入?yún)⒁蟊仨毷荅OF或在unsigned char范圍內(nèi)的值直接傳char是踩坑高發(fā)區(qū)。std::move(token)推入vector是避免多余的拷貝構(gòu)造。tokens.push_back(std::move(token))會把臨時字符串的所有權(quán)轉(zhuǎn)移給 vector 元素省掉一次深拷貝。雖然token本身就是局部變量但顯式move比讓編譯器自己推導(dǎo)更可控讀代碼的人也一眼能看出意圖。3.3 空字符串與連續(xù)分隔符的處理細(xì)節(jié)關(guān)于空子串的取舍我提一個容易忽略的細(xì)節(jié)字符串以分隔符開頭或結(jié)尾時語義會有歧義。例如split(,a,b, ,)如果保留空串結(jié)果應(yīng)該是[, a, b]因為第一個逗號前面有一個空子串。如果丟棄空串結(jié)果應(yīng)該是[a, b]。而split(a,b,, ,)保留空串時循環(huán)結(jié)束后還有最后一段結(jié)果是[a, b, ]。丟棄空串時最后一段為空不放入結(jié)果得到[a, b]。這個看似簡單的行為在解析 CSV 時卻涉及到字段對齊。比如一行a,,c表示三列中間列是空值如果用丟棄空串的策略就會變成兩列行數(shù)據(jù)錯位后面的業(yè)務(wù)邏輯全部亂套。所以我在接口里把keepEmpty獨立出來做開關(guān)解析 CSV 時傳true解析配置時傳false互不干擾。連續(xù)分隔符的處理邏輯同樣在上面代碼里體現(xiàn),,a按逗號拆分第一個 token 是空第二個 token 是空第三個 token 是a。保留空串時得到[, , a]丟棄得到[a]。實際項目中如果分隔符本身可能連續(xù)出現(xiàn)且用戶希望合并連續(xù)分隔符比如a,,b想得到[a, b]那需要另寫一個“壓縮模式”通常借助find_first_of加手動跳過空 token 實現(xiàn)。我的一般建議是不要在基礎(chǔ) split 里內(nèi)置偷懶邏輯讓調(diào)用方根據(jù)業(yè)務(wù)語義決定。3.4 多分隔符與分隔符集合有時你要按多個字符中任意一個來拆分比如按,或;或\t拆分日志行。find_first_of在這里很順手splitAny(a,b;c\td, ,;\t) // - [a, b, c, d]這段代碼內(nèi)部不斷用find_first_of找到任一分隔符的位置再把[start, pos)之間的內(nèi)容取出。需要注意的是find_first_of是按“字符集合”匹配的不是按“字符串”匹配的如果分隔符是; 分號加空格那任意一個分號或空格都能切開這在多數(shù)場景里正好符合預(yù)期。多分隔符版本我沒加入keepEmpty參數(shù)是因為它的語義和單分隔符版本可以保持一致只是內(nèi)部用find_first_of替代find。如果你要同時支持“多分隔符 保留空串 修剪”自己擴展起來很容易照著 3.2 的代碼把find換成find_first_of就行。3.5 性能細(xì)節(jié)reserve、string_view 與內(nèi)存分配的博弈實現(xiàn)里的另一個關(guān)鍵點是預(yù)分配。如果提前知道切分?jǐn)?shù)量可以用tokens.reserve(count 1)減少 vector 擴容時的拷貝。但很多場景下無法預(yù)知切分?jǐn)?shù)量所以我在實際生產(chǎn)代碼里往往先快速估計一個保守容量。一個樸素的做法是預(yù)先統(tǒng)計分隔符出現(xiàn)次數(shù)size_t estimate std::count(s.begin(), s.end(), delim) 1; tokens.reserve(estimate);對于單字符分隔符std::count的開銷極低但能顯著減少 vector 的多次擴容尤其是當(dāng) segment 數(shù)量大到成百上千時效果肉眼可見。對于多字符分隔符std::count不適用可以使用find循環(huán)計數(shù)或者干脆不預(yù)分配因為多字符分隔符的切分?jǐn)?shù)量通常沒那么大。如果追求極致性能可以寫一個split的string_view版本返回vectorstring_view。它完全不分配新的字符串內(nèi)存省去所有深拷貝代價是調(diào)用方必須保證源字符串的生命周期長于結(jié)果視圖。這個約束在函數(shù)內(nèi)部無法強制檢查只能靠調(diào)用約定和代碼注釋約束所以我通常只在性能敏感模塊里提供string_view版的私有工具函數(shù)不輕易放進(jìn)公共接口。公共接口保持vectorstring最穩(wěn)妥。4. 踩坑實錄與性能實測實戰(zhàn)里最容易翻車的細(xì)節(jié)4.1 常見問題速查表我在各種評審和代碼 review 里見過無數(shù)次同樣的 split 踩坑這里整理成一個速查表直接對著查就行。問題現(xiàn)象根因解決方案分割結(jié)果丟失最后一個空字段getline 方案遇到末尾分隔符不產(chǎn)生輸出改用 findsubstr或顯式檢查尾串中文等非 ASCII 字符出現(xiàn)亂碼按字節(jié)截斷substr按字節(jié)數(shù)切割確認(rèn)需要的是字節(jié)切分還是 UTF-8 碼點切分前者用 substr 沒問題后者要引入字符解碼分隔符是\\0或空字符串時空指針崩潰對delim.empty()未做防御開頭判斷delim.empty()時返回整個字符串使用std::isspace時傳入負(fù)值導(dǎo)致斷言char有符號且字符超出 ASCII 范圍先轉(zhuǎn)unsigned char再傳入isspacestd::regex拆分性能極慢正則引擎編譯匹配開銷大緩存std::regex對象或用 find 方案替代C23 split_view 得到的子范圍無法直接賦值給 string子范圍類型是subrange用std::string(part.begin(), part.end())構(gòu)造大字符串拆分時反復(fù)擴容內(nèi)存抖動vector 容量不足導(dǎo)致頻繁 reallocate先reserve估算容量或改用 string_view分隔符連續(xù)出現(xiàn)時結(jié)果不符合預(yù)期保留空串語義和丟棄空串語義混淆顯式指定keepEmpty策略不要依賴默認(rèn)值4.2 性能實測記錄我在一臺普通開發(fā)機處理器頻率約 2.6GHz內(nèi)存類型為常見的 DDR4上用一段長度約 1MB 的字符串做了拆分壓測分隔符是逗號共約 20 萬個小字段。對比了 getline、findsubstr、regex 三種方案結(jié)果如下方案平均耗時毫秒結(jié)果數(shù)量find substr未 reserve約 38200001find substrreserve 后約 31200001getline 流式約 66200000std::regex 動態(tài)構(gòu)造約 1120200001std::regex 復(fù)用對象約 95200001看到?jīng)]有正則的動態(tài)構(gòu)造版本比 find 方案慢了接近 30 倍即使復(fù)用了std::regex對象也慢了 3 倍左右。這個數(shù)據(jù)很有代表性如果只是按單個字符分割正則從來都不是明智選擇但如果分隔符是一個復(fù)雜的模式比如,\\s這種“逗號加任意空白”正則的語義優(yōu)勢就體現(xiàn)出來了此時 95 毫秒處理 1MB 文本也算可以接受。再補充一個string_view版本的性能參考同樣的輸入vectorstring_view版本耗時只有大約 2 毫秒。這就是零拷貝的威力但它要求源字符串在結(jié)果使用期間不能被銷毀或修改。我在解析一次性讀取的配置文件時經(jīng)常用這個版本邏輯上完全安全。4.3 生產(chǎn)代碼里的防御性細(xì)節(jié)防御性編程對 split 來說不是過度設(shè)計而是剛需。第一個防御點是空指針問題。如果接口接收的是const char*在構(gòu)造std::string之前就要判斷是否為nullptr否則string(nullptr)直接崩潰std::vectorstd::string split(const char* s, char delim) { if (s nullptr) return {}; return split(std::string(s), delim); }第二個防御點是空分隔符問題。前面代碼已經(jīng)演示了delim.empty()時返回{s}而不是進(jìn)入死循環(huán)。如果不加這個判斷find(delim, start)傳入空字符串時會返回start然后start pos 0永遠(yuǎn)停留在原地成為死循環(huán)這是個特別隱蔽的 bug。第三個防御點是分隔符長度大于源字符串長度的問題。比如split(abc, abcdef)find返回npos循環(huán)不進(jìn)入直接返回[abc]看起來沒問題。但如果分隔符是空串就沒這么幸運了所以空分隔符判斷必須單獨處理。4.4 編碼問題再談 UTF-8 下的字符串拆分中國開發(fā)者使用 C 時經(jīng)常遇到中文場景。C 的std::string本質(zhì)上只處理字節(jié)序列不感知字符編碼。按逗號拆分一段包含中文的字符串拆分后每個子串的字節(jié)數(shù)是 3 的倍數(shù)還好說很多時候會出現(xiàn)在某個漢字的中間字節(jié)處切斷的情況這時單獨打印子串看起來可能是亂碼。但大多數(shù)配置解析場景下目標(biāo)子串本身是完整的不需要按漢字邊界切分所以沒必要過度設(shè)計。真正的坑在于判斷字符是否為標(biāo)點或空白時直接對char調(diào)用std::isspace會因為符號擴展導(dǎo)致未定義行為這在 3.2 節(jié)已經(jīng)提到過。再補充一個場景如果你需要按中文逗號或者中文分號拆分只要分隔符本身是完整的 UTF-8 字符串find正常按字節(jié)序列匹配即可std::string的多字節(jié)字符串查找不涉及亂碼問題。但如果你用find_first_of且把當(dāng)字符集合傳入那就錯了因為它會把 UTF-8 編碼的三個字節(jié)當(dāng)成三個獨立字符來匹配。這個區(qū)別在文檔里寫清楚能少走很多彎路。5. 實戰(zhàn)選型建議與一個可以直接抄的工具版本5.1 不同業(yè)務(wù)場景下的選型建議配置解析類需求比如keyvalue對和分號分隔的選項列表優(yōu)先用 findsubstr 的通用版本開啟trimtrue、keepEmptyfalse能省去大量空串和空白判斷的樣板代碼。CSV 解析類需求必須保留空字段用keepEmptytrue的版本同時注意 CSV 中可能存在引號包裹字段的類型如果字段內(nèi)部包含分隔符那就要寫一個狀態(tài)機解析器單純 split 已經(jīng)不夠用了。日志清洗類需求數(shù)據(jù)量大且格式多變建議用string_view版本按行切分充分享受零拷貝帶來的性能收益但是要小心日志字符串在異步線程里被復(fù)用或覆蓋的并發(fā)問題最好在切分后立刻把需要的字段拷貝成std::string存進(jìn)結(jié)果結(jié)構(gòu)。命令行參數(shù)拆分空間分隔和引號處理規(guī)則比較特殊istringstream能輕松處理簡單的空白分隔但如果參數(shù)里帶引號和轉(zhuǎn)義建議直接引入一個成熟的全功能參數(shù)解析庫不要重新發(fā)明輪子省下來維護轉(zhuǎn)義規(guī)則的時間能做好多別的事。5.2 一個可以直接抄進(jìn)項目的完整工具頭文件為了讓你少做重復(fù)工作我把上面講的精華濃縮成一個單文件工具頭支持單字符、多字符、多分隔符拆分支持修剪和空串策略按 LGPL 類似寬松許可放出來你自己接進(jìn)代碼庫就可以用// str_split.h #pragma once #include algorithm #include cctype #include string #include vector namespace StrUtils { inline std::string trim_copy(const std::string s) { size_t b 0; size_t e s.size(); while (b e std::isspace(static_castunsigned char(s[b]))) b; while (e b std::isspace(static_castunsigned char(s[e-1]))) --e; return s.substr(b, e - b); } inline std::vectorstd::string split(const std::string s, const std::string delim, bool keepEmpty false, bool trim true) { std::vectorstd::string out; if (delim.empty()) { out.push_back(trim ? trim_copy(s) : s); return out; } const size_t dlen delim.size(); size_t start 0; size_t pos 0; while ((pos s.find(delim, start)) ! std::string::npos) { std::string t s.substr(start, pos - start); if (trim) t trim_copy(t); if (keepEmpty || !t.empty()) out.push_back(std::move(t)); start pos dlen; } std::string tail s.substr(start); if (trim) tail trim_copy(tail); if (keepEmpty || !tail.empty()) out.push_back(std::move(tail)); return out; } inline std::vectorstd::string split(const std::string s, char delim, bool keepEmpty false, bool trim true) { return split(s, std::string(1, delim), keepEmpty, trim); } inline std::vectorstd::string splitAny(const std::string s, const std::string delims) { std::vectorstd::string out; if (delims.empty()) { out.push_back(s); return out; } size_t start 0; size_t pos 0; while ((pos s.find_first_of(delims, start)) ! std::string::npos) { out.push_back(s.substr(start, pos - start)); start pos 1; } out.push_back(s.substr(start)); return out; } }用法示例#include str_split.h #include iostream int main() { namespace su StrUtils; auto v1 su::split( apple, banana ,cherry , ,); // v1 {apple, banana, cherry} auto v2 su::split(a-b-c, -); // v2 {a, b, c} auto v3 su::split(a,,b,, ,, true, false); // v3 {a, , b, } auto v4 su::splitAny(a;b,c\t d, ,;\t ); // v4 {a, b, c, d} for (const auto s : v1) std::cout [ s ]\n; return 0; }這個頭文件應(yīng)該足夠覆蓋最常見的需求。如果你需要string_view版本自己照葫蘆畫瓢把std::string替換成std::string_view把substr的返回值類型改掉即可核心邏輯不變。5.3 要不要用 C23 的 split_view我的偏向如果你所在項目已經(jīng)切換到 C23 編譯環(huán)境std::views::split值得一試??勺x性確實比手寫 find 循環(huán)好很多代碼意圖一目了然。但在決定全面使用前我建議先做一次時間和兼容性評估。一方面當(dāng)前主流編譯器對 C23 ranges 的支持程度不一致部分標(biāo)準(zhǔn)庫實現(xiàn)的 split_view 在特定輸入下處理空范圍時還偶爾出現(xiàn)奇怪行為遇到這些問題排查成本不低。另一方面現(xiàn)有代碼庫若要遷移從vectorstring到視圖迭代的接口差異需要改動很多調(diào)用點不是單純把 split 函數(shù)換掉就行。所以我更愿意持一種務(wù)實態(tài)度新項目在條件允許下優(yōu)先嘗試 C23老項目繼續(xù)用我已經(jīng)跑過千萬次調(diào)用的手寫版本。手寫版不丟人它穩(wěn)定、可控、無隱藏行為這也是它能在生產(chǎn)環(huán)境長期存在的原因。最后再分享一點實際經(jīng)驗用 C 寫字符串拆分這件事我前前后后寫了不下十遍從最開始只有二十行的 getline 版本到后來帶空串策略、多分隔符、修剪能力的完整工具最大的體會是接口設(shè)計比實現(xiàn)本身更考驗功力。千萬不能圖省事把所有行為都藏在一個“智能”的默認(rèn)值里否則不同調(diào)用方會互相踩對方的語義預(yù)期。好的 split 應(yīng)該把決定權(quán)交給調(diào)用者用參數(shù)顯式表達(dá)需求。還有一個小技巧如果你的項目有規(guī)約要求禁止使用異常那所有返回 vector 的 split 函數(shù)都應(yīng)確保沒有拋出異常的機會。std::string的默認(rèn)分配器在內(nèi)存不足時會拋std::bad_alloc這本質(zhì)上無法完全避免但只要不在 split 內(nèi)部做業(yè)務(wù)邏輯判斷理論上異常只可能來自內(nèi)存分配。業(yè)務(wù)上更重要的是別在 split 里塞入自定義刪除邏輯比如“字段名不要以_開頭就過濾掉”這類需求應(yīng)該放到調(diào)用方的循環(huán)里處理保持 split 的純粹單一職責(zé)。最后關(guān)于性能不要盲目追求 string_view 或者花式優(yōu)化先明確你的數(shù)據(jù)量級。每天處理幾萬個短字符串隨便寫都能滿足每秒處理上百萬行日志才值得把 reserve、move、string_view 全部用上。把有限的精力投入到真正需要的地方比復(fù)制一段“看起來很酷”的代碼更有意義。希望這篇拆解能幫你少踩幾個坑如果你有更特殊的拆分需求也可以沿著這里的思路自己擴展。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷激情五月综合| 国产avapp 网| 大香蕉久| 99操碰| 色婷婷五月天成人网| www.色九月| 99噜噜噜在线播放| 亚洲中文字幕网| 人人视频人人干人人做| 婷婷五月天婷婷| 婷婷五月播| 99re免费视频| 91九色成人原创视频| 色综合久久888| 久青操| 婷婷五月天激情五月天| 久久99久久99精品免视看婷婷| 五月婷婷狠狠干| 激情都市另类| 国产成人AV不卡| 色999五月色| 九九热思思| 深爱五月天 开心网| 色婷婷亚洲婷婷| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 六月丁香好婷婷| 激情深爱五月婷婷| 国产精品成人AV在线| 五月天婷婷综合久久| 日韩综合成人| 欧美色图片88| 操碰91| 五月丁香六月欧美| 五月丁香啪啪啪啪| 丁香五月激情视频在线| 久久 这里只有精品1| 婷婷色情网| 久热AⅤ| 国产AV一区二区三区日韩| 五月丁香综合啪啪| 九九综合伊人| 中文AV在线播放| 婷婷五月天在婷| 九九爱这里只有精品| 五夜丁香| 99免费热视频在线| 亚洲国产成人在线| 丁香九月激情| 天天日天天插天天操| 在线天堂9| 五月丁香六月婷婷的女人| 久久精品国产精品| 琪琪色网址| 欧美99| 婷婷综合色色| 日韩aaa| 久久总和99| 激情五月天影院| 天天狠狠色噜噜| 久久黄色免费视频| 五月亭亭激情综合| WWW.99热| 这里只有精品无码| 婷婷五月丁香久久| 亚洲色热| 国产真实乱了老女人视频| 天天色视频| 99热这里只有精品22| 91操网| 91凹凸在线| 99久在线精品99re5热视频| 日本VA视频| 五月婷婷二月丁香| 射区导航| 网站免费一站二站| yazhoujiqingav| 性生生活大片又黄又| 午夜成人片400| 色噜噜狠狠色综无码久久合欧美| 色婷婷AV久久| 五月丁香 啪啪| 五月丁香婷婷成人版| 91操在线观看| 激情六| 丁香六月狠狠| 五月婷婷婷婷婷| 色婷婷六月丁香综合欲精品| 久久久妻人人人| 婷婷在线播放av| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 亚洲另类婷婷五月综合| 一级黄色片看看| 丁香五月天社区婷婷| 九九性爱网| 欧美人久久| 久草婷婷| www.日日夜夜.com| 激情丁香五月天| 精品夜夜澡人妻无码AV| 一区二区三区XXXXXX| 99热插| 久9久9久9久9久9久9| 九九激情网| hd五月婷婷在线| 美女妹子后射视频网站在线观看| 久久综合五月天| 五月天综合| 99人妻碰碰久久久禁片| 婷婷99中文字幕| 五月天天天综合| 五月丁香六月婷婷在线播放| 国产 亚洲 在线| 色五月婷婷久久| 九九婷婷五月天| 成人网站高清无码| 深爱丁香网| 精品久久久久久久人妻| 五月天播播| 丁香六月婷婷缴情欧美| 九九99精品| 5月婷婷性视频| 色五月人妻| 五月婷婷之综合激情| 日本三级成人秘书精品片| 国产伊人大香蕉| 1024日韩| 夜夜久久综合网| 午夜成人片400| 精品视频网| 人妻性操逼中文字幕 国产| 五月丁香五月激情综合色综合| 99久久玖玖| 天天插综合| 91九色PORNY肉丝在线| 97视频久久| 狠狠插狠狠| 一级黄色影片| 五月激情综合性爱| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 丁香激情五月| 五月天婷婷乱| 97人人干人人操| 丁香五月ⅤA久久久| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 日本精品。999| 国产精品日日躁夜夜躁| 97色一二三| 国产日批视频免费播放| 在线视频另类| 久久久久亚洲AV成人无码电影| 色婷激情网| www.久热| 色五月婷婷中文字幕在线观看| 婷婷激情五月天小说校园| se99视频| 大香蕉九九| 五月天 无码| 亚洲愉拍99热成人精品| site:esunnet.com| 五月丁香综合| 欧日韩AV| 日欧一片内射VA在线影院| 大香蕉婷婷色| 欧美丁香五月97色| 色九月婷婷综合| 五月丁香偷拍| 一月婷婷色色| 91精品婷婷国产综合久久| 久久婷婷电影| 色五月天综合网| 五月停亭久久电影| 婷婷丁香在线播放| 婷婷五月激情五月丁香五月| 五月婷婷色五月| 91肏肏肏| anquye五月| A片女女女女女女BBBB| 大香蕉啪啪| 91婷婷色 | 97精品自拍| 久久五月婷婷视频| 99热综合在线| 久久婷婷五月天激情新地址| 丁香色色网| 亚洲a色| 91seAV| 日本久久爱| 日本色99网站| 天天艹夜夜艹| 99精品热视频| 超碰狠狠操| 国产精品久久99| 91狠狠综合久久| 五月丁香啪啪啪啪| 99精品综合视频| 久久综合网免费视频| 色综合五月天| 思思热99在线| 色色色色色色色色色色色色色五月天| 91se在线观看| 婷婷五月天堂网| 丁香五月激情网| 久久婷婷六月| 色综合99无码| 99超级碰碰| 9色在线视频| 任你草| 亚洲一个色| 另类小说五月天| 激情99。| 91视频久久久| 六月丁香久久| 丁香婷婷五月| 色吧综合网| 五月天激情小说| 亚洲热手机在线观看| 成人做爰高潮A片免费视频| 风流少妇A片一区二区蜜桃| 五月丁香六月婷精品视频| 狠狠色 综合色区| 夜夜夜夜夜骑撸| 色欲影香| 国产成人AV| 五月天综合在线观看| 九九干视频| 五月婷婷在线免费观看| 日本熟女一区二区| 九九操操| 超碰在线免费观看3 9| 丁香五月激情在线| 97亚洲色 torrent magnet| 免费观看欧美成人AA片爱我多深| 九九热这里只有精品6| www99热| 久久精品99国产精品日本| 丁香欧美| 2015好吊操| 婷婷综合中文| 久久99综合| 五月丁香WWW| 成人国产网| 婷婷综合色色| 久久久久九九九九视屏小说88| 五月天六月色| 日批在线看| 老妇操B| 粉嫩AV久久一区二区三区| 天天撸天天干天天插| 丁香婷婷五月综合色情| 另类图片五月天婷婷| 欧美婷婷日本| 婷婷日日夜夜| 先锋资源996| 99热性色| 久久ri精品视频| 五月丁香六月激情在线| 丁香五月欧美午夜视频| 精品国产va久久久久| 亚洲av成人一区二区电影在线| 亚洲激情网| 婷婷六月五月天综合| 色玖玖| 超碰人人操人人9| 91色色色| 久久亚洲婷婷| 久人操| 久热a| 亚洲激情av| 丁香激情综合| 色综合日日| 五月丁香六月久久| 亲子乱AV一区二区三区下载| 色婷婷玖玖影院| 99婷婷精品推荐在线视频| 激情久久肏屄视频| 天天日夜夜| 久99久热只有精品国产99| 久久99久久99精品免视看婷| 一区二区免费看| 久久九九99视频| 涩五月婷婷| 大香蕉天堂| 婷婷五月激情视频在线| 色婷婷色五月另类综合| 激情深爱婷婷网| 青青草99热久久精品国| 综合久久8| 中文字幕丰满孑伦无码专区| 色色色综合| 亚洲激情五月| 五月婷婷综合视频| 久热9| 天天肏天天肏天天肏| 91碰碰碰久久久久| 性爱五月婷婷| 97操碰在线视频| 9|在线观看视频| 婷婷婷狠狠| 欧美搡BBBBB摔BBBBB| 五月激情六月综合| 丁香婷婷五月综合| 99久久网站| 综激情网| 婷婷五月情| 激情五月天婷婷| 丁香伊人网| 欧美成人va| 5月婷婷6月六月丁香| 六月丁香激情综合| 五月婷亚洲精品| 五月婷婷开心六月激情小说| 66精品成人免费网站在线观看| 狠狠色噜噜色狠狠狠综合色| 丁香五月激情欧美| 97色97干| 久色网| 五月色综合| 五月丁香黄色视频| 99国产精品久久久久久久久久久| 色婷婷很很十八禁| 97人妻人人| 91九色超碰| 婷婷五月激情基地| 嘿嘿视频免费看9| 91久久免费| 久久性刺激| 精品激情| 丁香五月激情澎湃一区| 思思热这里只有精品| 91九色视频在线观看| 丁香五月色网| 久操操| 久久精品A片777777| 抽插特写| 五月丁香啪啪啪综合网| 天天草天天爱| 激情五月六月婷婷| 99视频在线精品| 五月花婷婷| 99热99艹在线观看| 色爱爱综合网| 色久影院| 欧美韩日AAA网站| 思思热国产在线| 五月婷婷六月激情| 国产亚洲精品AAAA片APP| 99热香港| 九九热精品| 激情综合五月.....| 五月激情综| 久久久www| 婷婷在线播放| 开心五月婷婷婷美女| 久久精彩免费视频精彩免费视频| 五月天激情子轮| 啪啪色区| 大香蕉综合视频在线| a色婷婷| 丁香五月av| 日韩AV免费看| 五月婷婷色色色| 夜夜骑日日夜夜| 五月丁香激情综合网| 26uuu国产| 丁香伍月婷电影全集| 91久久久久久久91| 开心五月婷| 婷婷五月综合社区| 五月丁香婷久久| 欧美精品999| 播五月丁香六月| 91狠狠综合久久久| txt五月激情四射网综合俺也来了 五月天婷婷丁香人人操91 | 视频综合网| 人人草人人视| 丰满少妇乱A片无码| 狠狠久久婷婷| 五月丁香综合啪啪対白| 秋霞成人毛片一级A片| 青草视频在线观看视频| 五月天无码| 五月婷婷成人| 91九色超碰| site:901-07.com| 婷婷丁香五月激情| 伊人婷婷大香蕉在线| www.超碰在线| 天天爽天天| 大香蕉久久视频久久视频| 色三级色三级| 天天干天天拍| 婷婷丁香www视频日本韩国| 热久久99视频| 天天爽天天爽| 99热偷拍| 91色五月| 久久九九中文字幕| 9久久久| 五月综合激情图片| 婷婷色五月天在线观看| 五月婷婷成人| 五月天婷婷基地| 丁香五月天AV在线 | 午夜九九九九九九九九九九九九九| 亚洲激情图文小说| WWW.99热| 九九黄色网| 九九成人视频| 婷婷六月色情| 成人丁香五月| 二区成人视频| 丁香 婷婷 亚洲 熟女| 色丁香五月婷婷| av在线免费播放| 五月天婷婷综合免费| 5月丁香美女影院| 色婷婷成人在线| 亚洲色网址| 黄网在线播放| 五月天婷婷在线AN| 噜综合| 五月天婷婷久久| 婷婷成人AV| 国内久久久精品99| 99久久久| 色婷婷丁香社综合| 久久综合五月天| 性热视频99精品| 99热这里只有精品3| 五月婷性爱| 丁香婷婷久久综合在线| 色色色丁香| 色五月天本日| 婷婷五月天精品| 日本熟女内射| 激情五月综合久久| 色综合激情| 丁香五月激情啪啪| 欧美大肥婆大肥BBBBB| 国产裸舞福利资源在线视频| 伊人综合网站| 五月丁香另类网| aaaa久久| 久久综合影院| 久久精彩综合视频| 少妇性BBB搡BBB爽爽爽视頻| 99性感视频| 久久婷婷青青| 婷婷综合色| 啪啪啪综合网| 国产乱子轮XXX农村| 2w在线视频| 思思热高清在线观看| H亚洲| 天天日天天干天天爽| 日本三日本三级少妇三级66| 色婷婷五月综合在线| 丁香六月婷婷综合激情欧美| 日本天天操| 婷婷色Av| 五月天久久综合| 伊人五月天在线| 这里只有精品日韩精品| 99操不停| 亚洲天堂久久| 久久五月婷天天干| 色婷婷a v| 日韩无码色色| 九九色视频| 午夜丁香 婷婷| 婷婷在线精品| 丁香五月婷婷成人网| 五月天操逼激情| 婷婷五月天偷拍| 亚洲人妻电影| 9精品久久999| 亚洲第一成人无码A片| 婷婷五月天天天日日夜夜| 韩国中文字幕91| 亚洲欧美丁香五月天亚洲欧美| 大香蕉啪啪网| 狠狠操狠狠干综合| 99在线观看| 7777国产盗摄农村女人| 丁香五月自拍| 色色哒五月婷婷六月丁香| 国内一级精品| 丁香五月婷婷免费视频| 五月婷婷丁香综合| 国产成人+亚洲+欧洲| 性视频久久| 色伦专区97中文字幕| 九九热免费视频| 婷婷五月天综合蜜桃| 91岛国片| 无码视频国内精品久久久| 九月婷婷激情| 九九精品视频在线6| 亚洲成人在线播放| 久久一级免费黄色片| 人人爱人人草| 操人久久| 国产精品视频久久99| 开心婷婷五月花| 亚洲 在线 性爱 | 婷婷五月天美女视频| 色婷五月天激情| 91视频五月丁香| 色婷婷五月天偷拍| 免费在线观看AV网站| 五月婷婷综合天天操| 熟美女麻豆| 日韩操人| 欧美综合五月丁香六月婷| 婷婷五月天黄色小说| 日本久久人| 色婷婷综合网| 超碰人人操人人9| 久久精品五月天| 青青热视频| 精品九九视频| 久久久久久久97| 亚洲V国产V欧美V久久久久久| 99热午夜精品| 色丁香婷婷| 天天艹夜夜爽| 久9热在线视频| 午夜69成人做爰视频| 成人 九九九九| 91九色在线视频| 婷婷五月天视| www.99热视频| 综合五月激情| 成人深爱丁香五月| 五月丁香花视频| 免费看欧美成人A片无码 | 9999热精品| 激情五月综合色| 九九热视频精品| 丁香激情网| 五月天婷婷色色首页| 18av天堂| 另类激情综合| 欧美日本高清视频99| 亚洲色激婷| 天堂综合久久| 婷婷天堂综合网| 丁香五月天激情网址| 五月婷婷之综合激情| 开心激情婷婷| 九九精品热| 激情深爱五月| 五月停停大香蕉| 婷婷香香五月| 激情综合五月天| 99热超碰人| 丁香五月久久| 狠狠干在线| 99玖玖人人| 91精品国产综合久久密臀| 国产一级片| 久久久久久久久久久97| 激情五月丁香六月综合AVXXXX| h在线看免费版在线看| 怡春院久操| 开心五月婷婷| 乱精品一区字幕二区| 婷婷五月在线影院| 丁香五月激情啪啪啪| 在线成人av播放| 97碰碰在线观看视频| 色欲影香| 99re这里只有精品9| WWW丁香五月| 婷婷色丁香五月| 性色视频| 9久精品视频| 婷婷五月天激情小说| 亚洲日韩一页精品发布| 天天婷婷天天| 人人爱国产| 夜夜躁婷婷AV| 欧美成人精品A片免费一区99 | 欧美综合五月丁香六月婷| 激情五月综合网| 天天人人天天爽| 五月婷AV| 国产精品成人AV在线| 天天干天干| 国产AV一区二区三区最新精品| 欧美日韩婷婷五月天| 五月婷婷亚洲色图| 五月丁香六月在线欧美| 五月丁香久久激情网| 五月婷婷色激情| 日本久久综合| 激情五月成年| 激情婷婷在线中文字幕| 色婷婷色五月色丁香| 五月好婷婷| 婷婷导航| 五月激情久久| 天堂婷婷五月在线| 五月丁香啪啪网| 婷婷五月天黄色| 夜夜嗨一区二区三区直播内容| 欧美日韩国产一区二区| 五月丁香六月婷婷在线小说视频| 99久在线精品99re8| 看黄的网站18禁| 欧美综合在线五月天色婷婷| 久久久99视频| 91在线资源| 激情五月天婷婷| www.99成人视频| 丁香五月婷婷啪啪| 亲子乱av一区二区三区的| 9久视频| 天天爽日日爽夜夜爽| www99热| 中文字幕高清av| 激情五月天啪啪视频| 激情色色色| 婷婷五月天在线观看| 99色日本| 亭亭五月天成人| 大香蕉婷婷| 婷婷丁香五月天色色| 五月天婷婷六月激情网| 色偷偷五月天| a级毛片一区二区免费视频| 丁香六月综合激情| 影音先锋偷偷色男人站| 六月丁香婷婷爱| WWW、日本色丁香co m| 色婷另类| 日本大逼91| 色婷丨日丨天丨综合久久| 婷婷九月亚洲| 五月天涩涩| 激情内射人妻1区2区3区| www.久久久.com| 色色色色色网| 另类图片五月天激情| 色婷婷基地在线| 丁香五月天堂网| 中文字幕操比影片| 九九九午夜影院成人| 久草五月天| 久久9精品视频| 五月婷婷开心五月| 亚洲AV成人精品网站在线播放| 五月丁香AV、伊人业余、性色熟妇| 少妇激情五月天| xxxx久| 欧美激情VA永久在线播放| 久热re视频在线观看网站| 久热2025无码| 99色在线| 五月情丁香色| 一起草av| 丁香婷婷综合五月天| 丁香五月天色婷婷| 异能之下短剧免费观看全集| 在线播放中文字幕| www.久久久.com| 五月丁香好婷婷A片网| 六月丁香激情| 久久婷婷五月天激情四射| 国产成人亚洲综合亚洲| 婷婷五月天伊人网| 一区操| 天天综合网在线| 在线看黄色| 亚洲操操操| 97超级碰碰碰| 91色在线/日韩| 五月丁香av中文| 97综合在线| 五月丁香大香蕉| 六月婷婷开心| 亚洲视频色色| 香蕉AV777XXX色综合一区| 婷婷开心青青草| 少妇出轨做爰高潮A片| 99在线国| 超碰京东热av男人的天堂| 免费观看的婷婷五月视频在线| 日本熟女一区二区| 色婷婷香蕉丁丁网| 91九色中文字幕女在线观看| 婷婷五月天六点丁香五月| 亚洲五月婷| 丁香五月综合久久八| www.激情| 久久免费视频62| 婷婷五月无码| 国产一级片| 天天 日综合| 丁香九月色| 天天做天天爱天天玩| www.99久久久| 五月丁香综合| 啪啪六月婷婷| 成人欧美日韩| 99无码| 人妻videos人妻高清| 日韩婷久| 99精品亚洲| 操逼123网| 99视频在线观看视频| 超碰亚洲天堂| 午夜精品777| 99碰碰中文| 99婷婷| 99久久婷婷五月天| 婷婷五月色综合| 天天日天天插| 成人免费va| 97色碰| 国产干逼片| 日韩欧美成人片| 99色1| 97色色网| 97五月天婷婷午夜| 久久全色| 丁香五月成人| 狠狠色五月天| 五月婷人妻| 天天综合久久| 亚洲精品字幕| 久久色天堂| 久久婷婷五月天激情| 爆乳熟女一区二区三区爆乳| 婷婷丁香社区| 婷婷情色五月天| 深爱开心激情网| 中文字幕,综合,91| 日本V在线观看不卡视频网站| 91日日日| 久久思思热视频| 大香蕉AV在线| 婷婷亚洲久久| 人人色人人弄人人操| 五月丁香操婷逼| 丁香五月av在线| 婷婷五月综合在线| 婷婷综合另类| 青青久在线视频免费观看| 久久超视频| 亚洲色欲AAAAAA| 五月天婷婷一起草| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 天天射天天干天插色综合| 丁香伍月婷电影全集| AV中文在线| 99热这里只有精品55| sewuyuejiqingwang| 九色视频91| www.综合久久| 综合五月激情| 欧美性猛交99久久久久99按摩| 五月丁香婷婷基地| 另类丁香综合| 综合久久丁丁香婷| 99精品视频在线观看| 久久色天堂| 99爱视频在线观看| 26uuu另类亚洲欧美日本一| 安息电影在线观看完整版| 亚洲成人AV在线播放| 97爱艹婷婷开心丁香激情综合| 日本狠狠干| 色啪综合| 亚洲天堂爱爱| 丁香五月婷婷基地| 综合色五月| 日日做夜夜爱| 天天爱天天做天天爽| 99精品这里只有免费视频| 丁香五月婷婷啪| 婷婷综合影院| 99热资源在线| 色婷婷久久视屏| 免费观看高清无码| av电影在线播放| 国产操B| 婷婷五月天综合亚洲| 中国丰满熟女A片免费观| 97人人干人人操| 久热免费视频| av九九| 婷婷久久网| 八戒青柠影视剧在线观看| 五月噜噜噜色综合| 人妻久久久| 五月天天天综合| 97色碰| 6月丁香婷婷激情| av亚洲国产小电影| 五月婷婷六月激情网| 五月天婷婷色色| 五月婷婷婷婷婷婷艺术| 91久久久久| 久久这里有| 91热久| 天天爽夜夜操| 成人五月天丁香婷| 丁香六月综合激情| 色欲婷婷夜夜| 欧美综合激情| 婷婷五月天成人小说| 九 九九九AV| 亚洲色婷婷五月天| 激情av| 亚洲va综合va国产va中文| 欧洲亚洲免费视频9| 国外亚洲成AV人片在线观看 | 精品人妻伦一二三区久久| 四色AVwww| 五月第四色| 久久性爱网站| 综合婷婷| www.爱操com.| 五月婷婷AV| 久久视频婷婷| 91精品综合久久久久久五月丁香| 成人在线视频网| 艳妇野外情欲放荡HD| 无码字幕中文| www.综合久久.com| 超碰人人色| 色小说婷婷五月天天天| 久久九九99字幕| 色五月五月婷婷| 五月天播播| 不卡在线中文字幕无| 亚洲成人AV一区在线观看| 五月天激情网址| 婷婷五月综合婷婷| 天天爽夜夜爽天天爽夜夜爽| 六月丁香网| 色色色免费视频| AV在线不卡播放| 激情婷婷九月| www久久五月com| 337午夜福利| 最新色色五月天| 九九色综合| 激情综合区| 丁香九月激情| 最新日韩AV中文字幕| 大香蕉啪啪网| 婷婷五月深爱五月| 色婷婷丁香五月| 超碰成人影视| 天天拍天天操| 丁香五月婷婷五月天| 日本色噜| 999久久久国产精品| 99热免费精品| 亚洲成人人人操| 色综合爽| www.99热在线观看| 一本久婷婷综合| 91超碰人人操| 91干在线| 五月天婷婷中文字幕在线播放| av中文在线| 免费99色| 大香伊人久色| 色综合色综合网| 色偷偷五月天| 久久丁香五月婷| 99热99热在线观看| 午夜成人天堂久久无码日韩久久| 十二区无码| 婷婷大香蕉| 99综合一区| www.婷婷.com| 日日操,夜夜爽| 欧洲亚洲免费视频9| 色综合综合色| 超碰成人AV| 九九婷婷热| 色和综合网| 强壮的公次次弄得我高潮A片日本 | 在线网黄| 99热天堂| 久热这里只有| 久 久9 9 热 视 频| 秋霞网在线观看理论91| 99在线观看视频免费| 一本久道综合99| 97久久久免费福利网址| 猫咪伊人AV| 在线色婷婷| www.ywav| 亚洲AV成人精品网站在线播放| 最近中文字幕大全免费版在线| 婷婷色综合| 99综合在线| 日本久久人人| 99热国内精品| 91狠狠综合网| 欧美在线操| 色99日韩| 欧美久久婷婷| 久久久18| 婷婷久久色| 99色在线视频| 超碰av在线| 六月色色| 男妓跪趴把舌头伸进我的嘴巴| 女人天堂AV| 久久99网站| 99视频只有精品| 拍真实国产伦偷精品| 九九九九国产| 六月丁香五月婷婷| 大地资源色婷婷视频在线| 少妇性按摩无码中文A片| 五月天婷婷影院| 国产精品久久久久久久久久| 少妇人妻偷人精品无码视频新浪 | www激情| 1000部毛片A片免费观看| 成人国产欧美大片一区| 影音先锋日本三级资源| www.色欲丁香婷婷| 97偷拍对白视频| www.色9| 天天玩夜夜操天天爽| 亚洲亚洲激情| 伊人9999| 婷婷激情六月视频| 久久婷婷成人综合色怡春院| 99自拍视频在线| 色综啪啪网| 亚洲精品网址| 久热婷婷| 激情五月综合网| 五月花亭亭| 2020日日干| 久久色情| 99热人人操人人操| 97视频91| 人人天堂操| 五月婷婷五月丁香| AV电影在线播放| 极品人妻VIDEOSSS人妻| 海外网站专业操老外| 婷婷性爱| 婷婷五月色综合| 欧洲一区二区| 中文字幕欧美日韩VA免费视频| 日韩国产AV播放| 久久99久久99精品免观看粉| 管管補管管紱| 亚洲综合五月| 在线99热| 九九久99免费视频| 热久久成人| 婷婷久久色| 99热这里是精品| 影院久久久| 青草网在线观看| 丁香成人色情五月天| 黄网免费看| 丁香五月大香蕉在线99| 色99热| 99热在线观看这里只有精品| 天天干天天日天天操| 午夜]香婷婷深深爱| 久久婷婷激情| 婷婷综合网站| 九九这里有精品| 欧美男女婷婷| 五月丁香激情综合欧美| 日本激情91| 香蕉曰比| 五月天色婷好好| 9月色婷婷| 色婷婷成人色网| 九九热99re8热免费观看| 激情综合色婷婷六月天| 色婷婷丁香五月| 久久久99婷婷久久久久久| 五月天激情.com| 99热手机在线精品| 亚洲激情五月| 91精品国产综合久久密臀| 91狠狠色丁香婷婷综合久久精品| 婷婷色五月开心五月| 久久久精久人妻| 久热91| 久久多色| 夜色综合网| 影院久久久| 韩国久久少妇视屏| 99热| 成人婷婷色五月天| 亚洲色久| 欧美大香蕉视频| 五月天婷婷成人| 欧洲综合一区| 九九操综合网| 婷婷久久综合久| 激情综合色网| 日韩淑女人妻luan伦激情精品一区二| 91丨九色丨国产| 亚洲激情电影五月天色婷婷丁香一起草| www.久久久久久久| 婷婷欧美激情| 婷婷五月激情五月激情| 免费碰碰视频久| 第一区久久网站| 少妇伦子伦精品无吗| 91操色| 色999;丁香五月| 久热视频A.| 久久久婷婷婷| 99久久99久久综合| www.99热视频| aaaaa不卡| 色五月天婷婷| 97久久人人操| 五月婷婷综合网| 天天综合激情| 亚洲操操操| 开心五月婷婷六月丁香| 少妇2做爰HD韩国电影| 五月天激情网图片 - 百度| 天天操夜夜操| 五月丁香999| 国产肥白大熟妇BBBB视频| 婷婷激情鹿城五月天| 搡BBBB搡BBB搡五十| 97婷婷丁香五月| 开心五月深爱五月丁香五月激情五月| 五月婷婷伊| 久久精品视频在这里有| 国产亚洲成AV人片在线| 激情五月,激情综合网| 无码髙清| 色五月激情| 久久亚洲网| 在线看片h站| 天天综合亚洲| 日本欧美国产| 天天色天天日| 这里只有精品热| www.com在线操视频免费观看| 婷婷狠狠操| AV在线中文| 婷婷中文字幕| 婷婷情色激情| 色五月婷婷自拍| 狠狠狠狠狠狠狠狠| 99惹精品视频| 久久大香免费| 另类图片天天影视在线观看| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 欧洲精品欧洲情| 五月丁香六月激情| 天天日天天草| 丁香五月婷婷啪啪| 久久久天堂国产精品女人| www.99视频| 91超碰在线观看| 99亚州综合精品成人网| 互月天综合| 久久最新色| 亚洲无码99| 激情五月小说婷婷| 六月激情婷婷| Blackedraw视频一区二区| 五月的色婷婷高潮| 一级片sese片.COM| 久久97久久99久久综合欧美| 天天爽天天| 五月婷婷天天色| 大香蕉75线| 97色色婷婷| 免费观看的婷婷五月视频在线| 狠狠色综合网| 嫩模草| 大香蕉九操| 亚洲激情综合免费| 九九色热| 五月色激情综合网| 这里有精品| 色五婷婷开心缴| 婷婷成人在线| 日本丁香久在线| 综合色在线| 久久久com| 美国色五月天婷婷资源站| 在线观看亚洲视频影院| 久9视频免费播放| 激情AV| 色婷婷4| 五月丁香基地| 九九AV在线| 99久热| 五月天婷婷色综合| 538任你爽视频不一样的| 亚洲综合久| 色婷婷成人在线| 五月婷婷福利| WWW久久久| 蜜桃成语时李时珍 免费| WWW.五月com| 99精品久久久久| 色视频2025| www夜夜操wwwcon| 综合五月丁香六月婷婷| 狠狠干婷婷| 大香蕉在线99热| 99视频网址| 欧美色色色色色色色色色色影视| 婷婷五月天六月| 站长推荐无码播放| 99精品偷自拍| 碰超亚洲| 丁香婷婷六月激情文学| 99热这里只有精品33| 欧美激情VA永久在线播放| 亭亭五月丁香综合欧美| 色五月开心五月激情五月| 99视频这里只有精品10| 91黄址| 99久热视频在线| 操B五月天| AV天堂婷婷五月天| 超碰激情网| 七月丁香五月婷婷在线| 日本久久精品18| 亚洲AV激情五月综合网| 久久在线大香蕉| 国产肥白大熟妇BBBB视频| 热99在线精品| www好屌操| 99riAv1国产在线观看| 少妇AB又爽又紧无码网站| 在线观看亚洲视频影院| 伊人五月久久| 久99综合婷婷| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 五月婷婷免费在线| 综合色色色色色色| 五月天激情小说| 99精品久久久久| 国产精品蜜臀99| 天天干狠狠| 天天操天天国产三级片处女学生妹| 99热这里只有精品首页| 色欲色香综合网| 九九成年视频| 婷婷五月丁香综合激情小说| 五月天婷婷色色网| 日本综合99| 五月综合激情久久| 久久丁香综合| www.色多多婷| 色色色色热热| 91热视频色网站| 婷婷五月天综合久久日| 六月欧美综合色情| 欧美婷婷日本| 91超级碰人人操| 亚洲性爱日韩无码| 婷婷五月天成人网| 亚韩在线视频| 99热在线只有精品| 欧美五月停| 激情五月深爱五月观看| 日日日日操| 人妻内射一区二区在线视频| 久久色情| A在线观看| 成人色五婷婷| 日本少妇裸体做爰高潮片 | 婷婷丁香大香蕉| 激情综合网激情五月网| 丁香五月六月综合激情| 亚洲人成网站999综合| 狠狠999| 婷婷激情五月| 激情五月天久久丁香| 婷婷午夜综合| 久久一级免费黄色片| 天天天天天日| 色九四色| 五月天性色| 三人荫蒂添的好舒服A片| 婷婷五月天受日本法律保护| Av九九| √天堂资源在线人妻熟女| 婷婷久久精品| 九月丁香八月婷婷久久综合久97| 婷婷五月情天| 男人的天堂av俄罗斯热| 五月激情基地| 在线看的免费网站| 精品婷婷五月视| 国产精品国产成人国产三级| 天天插天天插天天日| 狠狠狠狠狠| 香蕉综合网| 啊v视频在线观看| 思恩热国产视频右线观看| 亚洲操b| 激情深爱五月婷婷| 中文av网| 五月天激情站| 成人无码髙潮喷水A片| 妻久久久久| 欧美成人AAA片一区国产精品| 激情五月天在线| 伊人久久婷婷| 欧美另类五月激情| 国产99久| 99在线精品免费视频| 97久操| 色婷另类| 五月色情婷婷| 蜜臀AV在线观看| 五月天久久www| 影音先锋五月天婷婷丁香在线观看| 丁香五月色欲| 免费亚洲成人电影AV| 九月综合| 丁香婷婷性爱| 综合五月婷婷| 色婷五月丁香久亚洲| 狠狠干婷婷| 人人看人人摸人人| 久久大香蕉视频| 99色色网| 婷婷香五月| 五月天丁香成人| 欧美色五月| 五月婷婷六月开心| 婷婷中文无码| 国产精品久久久久久妇女6080| 色了色综合| 天天插天天射天天干| 丁香五月影院| 99热99热| 亚洲情色一区| 亚洲情综合五月天| 久久这里只有精品99| 日本怕怕视频| 成人AV播放| 任你爽免费视频| 丁香五月在线伊人| 99ri精品在线观看| 色五月婷婷91| 五月丁香色婷婷婷基地| 久久黄色片| 99色网站| 就爱啪啪婷婷| 色婷婷AⅤ| 99在线免费观看| 色五月婷婷综合|