99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
色综合天堂| 亚洲精品视频电影| 五月丁香婷婷爱| 国产肥白大熟妇BBBB视频| 99热都是精品| 搡BBBB搡BBB搡五十| 精品综合五月| 91狠狠色丁香| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 久久五月天视频| 亚州婷婷五月激情综合| 久久丁香综合| 亚洲视频丁香网va| 九 九九九AV| 丁香激激情网| xxxx久| 五月天激情视频| 久久人操-久草婷婷-成人AV| 久久精品9| 三级三久久线久久99久目本WW| 思思久久99热只有频精品66| 色噜噜狠噜噜视频| 色永久| 超碰丁香五月| 五月婷婷色| 国产亚洲99| 色综合久久888| www.伊人天堂偷偷婷婷| 99re青青草| 97色婷婷| 成人无码髙潮喷水A片| 综合色影| 66精品成人免费网站在线观看| yw国产AV| 丁香五月天激情视频| 激情九月婷婷| 97综合在线| 色吊操色妞| 欧美性爱五月天| 日本AAAAAAAAAAAAAA片| 综合狠狠干| 丁香五月婷婷香| 丁香 亚洲 久久| 中文字幕永久免费| 日本色色图| 成人中文字幕在线| 美女黄频aⅴ视频| 少妇大叫太大太粗太爽了A片| 五月丁香婷婷三级| 韩国婷婷丁香五月| 日本成人噜噜| 中文不卡一二三区| 亚洲五月婷婷| 五月婷婷免费看| 超碰电影在线播放| 五月天婷婷基地| 国产午夜精品AV一区二区麻豆| 色五月婷婷DVD| 欧美超级视频97| 91狠狠综合久久| 91美女被操| 久久草婷婷丁香网站| 韩国19 主播内部福利vip免费播放| 99热这里有精力| 丁香五月天av| 婷婷香五月天| 五月天开心激情综合网| 五月天色婷婷网| 玖玖九九99| wwccc久久久| 成人狠狠成人狠狠成人狠狠成人狠狠| 性色视频| 99爱在线精品视频免费观看| 激情内射人妻1区2区3区| 亚洲精品白浆高清久久久久久| 国产成人精品一区二三区熟女在线| 五月色丁香| 婷婷五月草| 4399无码视频二区| 国产精产国品一二三在观看| 五月婷在线| 裸体做A爰片毛片A片免费| 性做爰1一7伦| 大香蕉 婷婷| 五月丁香综合啪啪| 久久99草五月婷婷| 狠狠操之狠狠操| 97色色婷婷五月天| 婷婷激情综合网| 色五月丁香网| 亚洲美女网Va| 国产 亚洲 在线| 99热这里只有精品55| www.色婷婷.com| 国产乱子轮XXX农村| 99久久这里只有精品| 五月激情在线| 亚洲一区二区无遮挡A片| 丁香五月久久| se色99| 91九色|疯狂|高潮|对白|| 中文字幕不卡视频| 狠狠色综合网| 丁香六月五月天| 天天做夜夜爽| 4438成人电影| 五月丁香六月综合基地| 丁香激情五月| 无码啪啪| 色婷婷六月激情| 日本成人噜噜| 激情开心五月天| 天天视频精品9| 欧美婷婷九月| www开心激情网| 色综合五月| 狠狠干,狠狠操| 五月天激情图片网| 婷婷婷婷婷婷婷五月丁香| 久热成人| 色婷婷五月影院| 欧美性猛交99久久久99| 狠狠做深爱婷婷久久综合一区| 九九久久99| 99热网站| AV伊人青草丁香六月| se99视频| 大香蕉视频99| 九九蜜臀精品| 亚洲婷婷免费| av免费在线观看0| 激情另类综合| 99这里都是精品| 综合激情肏逼网| 国产91视频| 婷婷六月综合在线| 色色五月婷婷久久| 激情图片久久| 五月婷婷成人| 夜夜爱伊人| 午夜理论片最新午夜理论剧| 久久精品系列| 色婷婷综合网| 91久久婷婷| 91色久| 激情五月婷婷综合网| 九九九热精品| 中文精品在| 五月丁香黄色视频| WWW、日本色丁香、co m| 密臀久久| 国产黄色在线| 亚洲色婷婷| 婷婷六月色| 久热综合| 婷婷五月在线观看| 五月丁香综合伦理片| 婷婷五月天伊人网| 中文字幕网站在线观看| 99九九在线视频| 黄色91在线观看| www.日日夜夜.com| 免费啪啪亚州视频| 欧美激情综合色综合啪啪五月| 91精品91久久久中77777久久玖玖九九| 色色哒五月婷婷六月丁香| 超碰狠狠干99| 综合激情五月丁香9999久久精| 色5月婷婷| 在线视频另类| 丁香99| 99re这里只有精品首页| 第九色区av天堂| 婷婷色播色五月五色五月天色妇| 免费视频WWW在线观看网站| Av性爱网| 色九九九综合| 91人人操.COM| 超碰97干| www.色五月| 久色成人| 天堂色色色| 婷婷五月天电影网| 九九色中文| 亚洲欧美一区二区三区四区爱爱动图| 99热碰碰| 日本啪啪视频HD| 热的国产,热的综合,热的有码| 色五月综合| 久久久大香蕉| 99五月香婷婷丁香在线视频| 丁香五月第四色88| 色五月婷婷91| 久久久国产精品黄毛片| 五月激情婷婷国产精品久久久久久 | 97综合色片| 激情六月天婷婷| 噜噜色天天开心| 天天日天天舔| 五月婷婷综合色啪| 婷婷激情四射网| 欧美操人| www.sd-xiangsu.cpm| 婷婷成人基地| www.婷婷,com| er99免费视频在线| 国内精品免费一区二区2009| 激情九月婷婷| 丁香花五月天| 久久九区| 九色PORNY在线精品酒店| 97色色色色色| 五月综合激情视频在线| 五月www| 国产特级毛片AAAAAAA高清| 米奇影视资源婷婷狠狠色激情欧美五月丁香| 665566 无码| 久久92| 国产又黄又爽又色的免费| 丁香五月天啪啪激情综和网| 91亚洲免费片| 久久久天堂国产精品女人| 婷婷五月精品中文字幕| 天天xxxxxx天天日| 五月婷婷六月激情在线| 婷婷色五月激情| 色婷婷狠狠禁久久| 丁香五月五月婷婷欧美大香蕉| 五月激激激情综合网| 都市激情久久| 亚洲综合99| 色九月丁香婷婷蜜桃在线观看| 日本高清久久| 激情人妻综合| 亚洲va综合va国产va中文| 久久这里只有精品网| 99热这里只有精品1025| 少妇人妻人伦A片| 99九九玖玖| 色 五月婷婷基地| 99re视频在线播放| 9精品视频在线观看| 亚洲五月六月婷婷| 欧美五月停| 精品亚洲VA网站| 久久中文人妻系列| 射久久丁香五月| 免费无码毛片一区二区A片 | 激情六月丁香综合| 婷婷丁香六月天激情四射网| 日本一级黄色片。| 久久九九99视频| 丁香五月天堂网| 天天日夜夜爽| 丁香六月婷婷综合| 国外亚洲成AV人片在线观看| 五月丁香六月片| 色色无码| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 99爱视频| 久久大香蕉同僚| 日日夜夜天天| 黄色成人网站在线播放| 久99久在线| 色丁香五月婷婷| 情趣视频66| 丁香伊人综合| 五月之婷婷| 色情五月天A片| 五月天色官网| 99热亚洲精品| 99riAv1国产在线观看| 五月六月丁香激情| 色综合色五月| 开心激情站| 狠狠综合| 亚洲AV无码成人电影| 丁香五月综合狠狠| 九月丁香婷婷| 色哟呦av| 五月天婷婷亚洲| 色婷婷影院| 91九九| 婷婷五月丁香五月丁香| 色九月婷婷| 女婷久久| 五月丁香六月婷婷中合网| 九九热这里有精品23| 再次出发二| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 人妻22p| 久久99婷婷| 丁香五月婷婷色| 色久婷婷五月| 久久视频这里99| 婷婷瑟瑟五月天| 久久五月六月| 伊人AV五月婷| 99性爱| 欧美69久成人做爰视频| 4438成人电影| 五月天婷婷在线观看精品男人| 亚洲婷婷丁香五月亚洲| 五月丁香激情综合久久| 综合网激情| 97自拍视频在线| 五月天丁香| 狠狠综合久久综合| 琪琪秋霞| 蜜臀av粉嫩av懂色av| 丁香五月婷婷色| 99热在线观看| 影音先锋毛片网站| 噜噜在线| 色婷婷综合久久| 99日精品视频| 深爱激情69热| 天天天天干| 久久女婷| 欧美伊人9| 丁香婷婷少妇| 99爱视频在线| 99久久精品国产色欲| 五月婷色| 色色丁香婷婷综合| 久久aaaaa| 《诡秘之主》在线观看| 婷婷的色色五月天| 婷婷九月久久| 亚洲九九99精品视频在线播放| www.五月婷婷.com| 大香人妻| 日韩成人网址| 伊人色综合网| www综合久久| 五月天影院婷婷在线观看| 丁香蜜臀黄色婷婷五月天| 成人.在线日韩| 五月婷婷狠狠干| 丁香六月色婷婷综合| 夜夜撸夜夜骑| 91综合网| 成人色色视频| 综合AV网| 天天干天天干天天干天天干天天干天天| 天天插天天插| 丁香久久久| 天天操天爱综合| 五月天激情四射| 激情五婷网| 日婷婷久久开心| 超碰在线超碰| 丁香五月无码| 97超级免费无码| 丁六月激情| 色色性爱视频| 色综合色婷婷色伊人| 影视av久久久噜噜噜噜噜三级| 在线日韩av| 婷婷综合在线观看视频| 男人操女人高潮91视频| 99视频精品8 | 久久久99久久| 99九色视频在线观看| 激情综合五月婷婷| 中文字幕网站在线观看| 欧美色色色色色| 日韩成人电影在线播放| 九九RE视频在线精品| A在线观看| 五月丁香综合| 久久人人看| 超碰99热| 狠狠色婷婷7| 啊v视频在线观看| 五月婷婷大香蕉| 激情综合色| 思思99热这里只有精品| 99欧美| 人妻videos人妻高清| 第九色区av天堂| 96精品成人无码A片观看金桔| 五月丁香啪综合| 丁香九月婷婷综合| 七七九九色色| 婷婷丁香六月天激情四射网| 久久免费操| 婷婷五月电影院| 99热91| 这里只有精9| 亚洲情综合五月天| 婷婷五月色惰| 五月婷A V在线| 丁香六月婷婷姐网| 91色五月| co超碰在线观看| 久久99热久久99精品| 丁香六月色| 天天噜日日噜综合无码| 丁香狠狠| www色综合亚洲92| 99九九综合久久九九| 婷婷五月色播网| 成人无码精品1区2区3区免费看| 婷婷色五月色妇| 狠狠色婷婷丁香五月| 欧美影院| 激情亚洲色图片丁香综合| 九月婷婷综合色干| 思思热在线观看| 六月婷婷狠狠做| 丁香六月亚洲| 啪啪91| 久久视频这里99| 色情丁香五月婷婷精品| 又大又粗九一在线| 日本三级中国三级99人妇网站| 综合xx网| 99视频内射三四| 婷婷不卡基地| 91精品91久久久中77777| 四月婷婷丁香| 丁香五月六月婷婷自拍| 亚洲成人av在线| 国产AV一区二区三区最新精品| 人人色婷婷| 婷婷五月天在线观看av| Av九九| 日本在线观看99| 婷婷永久在线| 99ri视频在线播放| 婷婷五月天开心激情网| 久色姿源| 亚洲网站在线鸭子av| 久久天堂色| 激情六月天婷婷| 亚洲日韩一页精品发布| 婷婷涩涩五月天| 五月丁香婷中文字幕| 91vip在线观看| 日韩无码亚欧无码| 百度一下国产精品A| 日日.c| 久久久久久人妻| 六月婷婷影院| 丁香色啪综合| 婷婷久久久久久久| 九九热这里有精品视频| 99色网站| 色热久| 五月丁香婷婷啪啪网| 五月天久久色| 人妻丰满精品一区二区A片| www.99热视频| 国产成人av在线播放| 99看片| 夜夜操天天爽| 五月开行婷婷色五月| 色五月天中文字幕| 欧美天天干五月丁香| 婷婷色播婷婷| 97福利视频| 97香蕉久久超级碰碰高清版| 97操碰碰无码视频| 九九热中文| 香蕉综合在线| 婷婷五月激情四月综合| 九九Y精品热播| 丁香五月婷婷社区| 丁香激情五月天| 琪琪色网址| 五月丁香色欲| 婷婷五月丁香综合桃花色网| 亚洲免费观看高清完整版AV线| 色综色五月天婷婷| 成人综合伍月天| 停停五月天激情网| 人人干av| 91久久久久久久久久久| 久久激情五月| 五月婷婷黄色网址| 日韩精品电影| 丁香五月天网站| 色九九综合| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 99色性爰网络| 成人做爰高潮A片免费视频| 丰满少妇乱A片无码| 野战J办公桌椅H| 婷婷五月综合色小姐小说| www99精品亚| 婷婷五月丁香欧洲| 婷婷6月综合网| 五月丁香六月婷婷不卡免费无码 | 丁香五月婷婷av| 久热伊人| 亚洲网站观看视频| 日本WWW九九九| 激情九月综合| 亚洲 在线 性爱 | 色婷婷伦理| 日日操夜夜爽天天天| 精品三区影院| 五月天堂色| 久久AV无码精品人妻系列试探| 久久久潮喷-久久久九九-成人AV| 久久多色| 综合伊人狠狠| 九九色热| 99色.com| 丁六月激情| 激情六月婷婷| 狠狠色噜噜狠| 如何安全看伊人婷婷| 九九九成人在线视频| 激情都市丁香婷婷| 疯狂做受XXXX高潮A片动画| 伊人久久大香线蕉AV最新午夜| 五月丁香琪琪| 丁香五月a| 色色色色综合| 极品另类| 思思热国产| 91viP在线看| 天天久久狠狠色综合| 99综合色色色| h在线看免费版在线看| www.婷婷五月天| 久久精彩免费视频| 五月天色不卡| 色五月天综合网| 色色综合视频| 婷婷五月综合激情免费| 久机视频这只有精品| 青青福利网| 婷婷开心青青草| 亚洲激情电影五月天色婷婷丁香一起草 | 色色婷婷五月| 九九性视频| www.久久爱.com| 久久9热| 日韩在线观看亚洲| 丁香五月在线自慰| 五月婷婷av| 久久丝丝热| 只有精品视频在线观看| 婷婷五月天激情在线观看 | 99久久er| 色五月综合激情| 婷婷五月图片小说视频| 日婷婷| 大香蕉中文| 婷婷射丁香| 色五月丁香五月| 一区=区操屄高清大全av| 牛牛澡牛牛爽| 丁香五月婷婷香| 欧美日韩中国| 操逼六区| 天天天操天天天爰| 激情五月婷婷综合色播小说| 五月婷婷色五月| 久操福利| 粉嫩AV久久一区二区三区| 色一色综合| 熟女国产在线一区二区三区四区| 91se在线观看| 思思热天天看| 亚洲色色色色| 亚洲精品视频电影| 26uuu国产| 五月丁香六月激情| 国产av基地| 狠狠色婷婷在线| 色五月婷婷DVD| 国产免费一区二区三区三州老师F1F1.CC| 99热这里有精力| 色色三级视频| 五月99久久| 丁香六月婷婷综情欧美| 亚洲性图一区二区| 99这里只有精品| 久久亚洲激情五码| 懂色av粉嫩AV蜜臀AV| 五月婷婷成人| 亚州激情在线视频| 五月丁香成人小说| 日韩婷婷| 97碰成超视频免费视频| 亚洲久艹| 包操45分钟网站| 色婷婷社区| 亚洲五月婷婷| 婷婷丁香六月天激情四射网| 久久狠狠欧美| 思思热高清在线观看| 色综合九九| 国产精品18久久久| 99在线精品视频| 丁香婷婷久久激情| 九九精品综合| 91碰操| 天天人人综合| 丁香五月av| 日本人妻伦在线中文字幕| av无码电影| 99在线看片| 99啪啪视频| AV六月丁香| 五月丁香综合网色欲| 欧美色色干| 五月色亭丁香| 人妻AV在线观看| 青青草婷婷五月天| 色综合网上班开心婷婷久久| 五月天六月色| 热99色| 色婷婷婷av| 一本色道久久综合狠狠躁小说| 91超级碰碰| 色玖玖导航| 天天做天天摸| 爆乳熟妇一区二区三区四区| 99热欧美在线观看| 噜噜噜狠狠色综| 欧美日韩国产成人在线| www。五月天。com| 久操热线| 99久久亚洲精品视频| 五月丁香综合激情| 五月黄色婷婷| 五月天激情子轮| 国产成人精品一区二三区熟女在线| 五月天婷婷网站888| 五月丁香六月激情欧美综合| 五月婷婷香蕉视频| 色天天综合色| 亚州美女| 色噜噜伊人| 狠狠草在线观看| 久久九九爽| 强伦轩人妻一区二区电影| 亚洲视频另类| 激情五月丁香六月综合AVXXXX| 丰满少妇猛烈A片免费看观看 | 性生活视频98791| 婷婷激情五月视频| 狠狠穞A片一區二區三區| www.色欲丁香婷婷| 激情综合色| 欧美日韩二区在线| 热99只有精品| 高清a片基地| 婷婷丁香色五月久久88| 日本色超碰| A久网| 99久久婷婷国产综合精品电影| 99在线视频在线观看| 51精品国自产在线| 久久婷婷欧美| 亚洲综合色激情色五月| 99热在线观看精品| 最新日韩久热免费视频看看| 狠狠色综合网| 五月天婷婷网站888| 97精品欧美91久久久久久久| 色综合色色| 996er热| 99这里有精品免费| 影音先锋91在线资源站| 婷婷激情五月天小说| 99视频日韩| 开心婷婷五月| 久久天堂网| 日本三级日本三级99| 99碰碰| www.超碰| 色天天综合| 五月婷婷九九久久| 综合欧美五月婷婷| 色色丁香| 婷婷网五月| 九九精品碰| 五月婷婷丁香六月| 日韩婷婷| 大伊香蕉精品视频在线| av中文网站| av成人在线播放| www.zbzhongsen.com| 天天舔天天摸天天射| 五月停性愛| 亚洲色夜| 色必久悠悠影院| 婷婷六久久| 久久9热| 天堂AV三级| WWW、99热| 香蕉人在线香蕉人在线 | 狠狠干婷婷| 国产无遮挡又黄又爽免费网站| 99re最新地址| 五月丁香色色| 丁香五月婷婷激情97| 亚洲久久激情| 在线国产精品色| 十二区无码| 91婷婷丁香| www.色窝| 国产精品成人AV在线| 99精品成人无码A片观看金桔| 亚洲色色香蕉| 日韩欧美五月丁综合| 综合色七七| 999热在线视频| 青青草六月丁香| 97在线/亚洲| 色欲色欲久久宗合网| 色婷婷国产精品综合在线观看| 99成人精品六| 五月天色色婷婷| 综合天堂AV久久久久久久| 美欧成人视频| www,色中色| 人妻精品在线| 九九色婷婷Av| 色九九综合| 亚洲婷婷丁香| 夜夜操,天天撸| 成人深爱丁香五月| 欧美啪啪9| 天天肏视奸| 97色色网| 91碰超| 五月丁香婷婷综合网色欲| 激情五月天色色网| 激情丁香五月| 欧美十二区| 91久久婷婷| 国产成人在线精品| 色五月婷婷久久| 婷婷大美在线| 大香蕉五月天婷婷| 久激情| 操B无码视频国语| 国产精品色色| 日本99视频| 女人天堂久久| 亚洲精品国产精品乱码视99| 九九久久五月天综合伊人| 丁香五月天导航| 97影院一级片| 碰碰人人漕| 91久久18| 99re这里| 丁香五月激情无码视频| www.狠狠色.com| 丁香六月婷月91婷月| 婷婷在线综合| 色色色五月婷| 久久九精品| 99九九99九九九视频精品| 亚洲精品字幕| 无码激情AAAAA片-区区| 色墦五月丁香| 日日干夜夜干| 婷婷激情五月综合| 91精品久久久久久77777| 99啪99| 91视频五月丁香| 婷婷五月天激情小说| 天天激情站| 性生活视频98791| 六月婷婷国产| 五月婷婷之美女图片| 欧美va亚洲va在线播放| 99热这里只是精品| 婷婷五月色亚洲| 久久这里99| 天天干天天操天天爱| www.久久五月天.com| 这里只有视频精品| 五月婷成人网| 亚洲久久婷婷丁香五月天| 婷婷另类开心| 丁香六月成人网| 婷婷五月天com| 天堂婷婷丁香六月网| 夜夜操狠狠操天天操| 激情黄色小说五月天| 久久99热精品a片在线观看| 伊人深爱综合| 婷婷色色欧美| 亚洲综合色网| 99在线播放视频| 97色色综合| 丰满人妻一区二区三区| 韩日另类| 丁香婷婷久久综合在线| 啪啪五月综合| 99九九综合久久九九| 色五月丁香五月| 激情综合5月| 色婷婷五月天激情综合| 久久婷婷五月综合色和| 五月婷婷激情网| 丁香五月久久| 五月丁香综合激情| 91午夜婷婷狠狠久久综合9色| 微拍92| 91丁香五月| 秋霞三级色戒| 亚州精品久久久久AV无码| 99精品视频网站| 超碰在线免费| 男人综合网| 丁香五月激情视频| 毛片新网地| 日本99久久| 超91热| 射区导航| 欧洲婷婷五月天| 五月天色网站| XX久久| 国产精品第一国产精品| 日韩AV免费| 激情另类综合| 精品综合五月| 国产色网站| 99热这里只有精品99| 色婷婷人人| 91丨九色丨东北熟女| 成人网丁香五月| 久re热视频| 天天日夜夜爽| 99啪在线| 日韩人妻无码一区二区| 99热免| 五月丁香六月在线| 99热色综合| 99热91| 五月丁香六月婷婷亚洲视频| 97色干| 九九九干精品| 丁香五月天导航| 婷婷色五月色| av中文在线| www91在线| se99在线| 久操大香蕉| 中文字幕丰满乱孑伦无码专区| 日韩婷婷| 婷婷天天婷婷天天澡| 99精品热| 涩涩婷婷五月| 色五月丁香激情视频| 日本三久久| 婷婷中文字幕欧美| 人妻熟妇国产精品| 日日综合网| 伊人五月天| 日本三级日本三级三级人妇四虎| WWW.夜夜| www.婷婷五月天| www.99热在线观看| 国产成人+亚洲+欧洲| 丁香五月天激情综合| 色综合久久综合| 色婷婷五月天天天做| 五月天久久婷婷| 免费观看日韩成人av| ,99视频久久| 五月婷婷啪啪啪| 狠狠色综合久久久久| 99热20| 综合久久97| 激情丁香五月综合| 色五月激情综合| 色噜噜狠狠色综无码久久合欧美| 99日精品视频| 青草激情综合| 教师性爱毛片| 四虎婷婷五月天| 99热精品在这里| 五月婷婷丁香啪啪| 人人人操| 五月丁香六月情| 色婷插| 天色综合网站| 无码少妇高潮喷水A片免费| 五月天啪啪视频| 9月色婷婷| 99内射视频| 六月丁香久久| 五月久久综合| 丁香五月亚洲无码| 国产美女无遮挡裸体毛片A片| 色久播播| www五月| 日本久久精品| 超碰在线91| www.婷婷亚洲基地| 色99热| Www99热| 久久在线大香蕉| 色五月中文字幕| 色五月丁香婷婷在线观看| 五月丁香亚州综合网| 婷婷丁香五月天亚洲| 亚洲无AV在线中文字幕| 五月天六月天| 免费看欧美成人A片无码| 色五月aV| 无码人妻丰满熟妇奶水区码| 五月婷综合性中心| 婷婷色五月91啪啪| 天天天天做夜夜夜夜做| 久久婷青青草原| 狠狠色噜噜色狠狠狠综合久久成人波| 人人肏逼视频在线一区二区| 激情性五月天免费小说视频| 亚洲成人综合网在线免费观看| 国产裸舞表演WWWW| 久99久视频精选| 六月丁香五月婷婷| WWW99热| 婷婷五月天丁香| VA日本视频| 无码少妇高潮喷水A片免费| 千人斩操逼| 99婷五月| 日本五月天婷婷丁香| 免费亚洲成人电影AV| 五月综合激情| 天天天久久久| 亚洲中文字幕AV在线| 亚洲色色香蕉| 97热在线精品| 国产午夜一区二区三区| 91免费在线视频6| 婷婷影院A成人| 亚洲色色香蕉| 中文资源在线a | 丁香六月婷婷色XXXXX| 色婷婷免费视频| 丁香婷婷激情综合五月激情| 99热| 色在线视频网2025| 国产成人高清| 五月婷在线| 婷婷五月图片小说视频| 六月丁香色色色| 丁香五月天社区| 天天舔天天摸天天透| www.久久婷婷| 激情五月综合网| 婷婷五月天免费| 丁香六月婷婷综合啪啪| 91一起操| 日韩在线五月天婷婷| 亚洲激情综| 人妻体体内射精一区二区| 亚洲aV写真天天综合网久久| 久热中文字幕| 精品香蕉99久久久久网站| 九九这里有精品| 黄色99视频| 丁香五月激情啪啪综合| 操碰99| 亚洲婷婷六月天| 日本操片| 中国女人做爰A片| 亚洲美女网Va| 玖玖伦理电影| 色色五月激情| AV九九| 中文av网| 99这里只有精品国产| 激情婷婷22月间| 亚洲色网址| 九九激情视频| 五月天激情综合首页| 亚洲中文AV网站| 五月天六月色| 十一月婷婷激情四射| 人妻久久久久久久久妻久久久久久久久| 色久天| 亚洲小视频免费观看| 大香人妻| 国自产拍偷拍精品啪啪一区二区 | 久久丁香| 五月花免费视频| 美女要搞搞天天搞搞搞网站| 92国产福利| 婷婷五月色播天| 色九月| 成人丁香| 色五月激情基地| 第四色婷婷日本| 色婷婷久久视屏| 色色色激情网| 99热综合网| 婷婷久久精品| 日日操天天| 情情五月天色| 91狠狠色丁香婷婷综合久久精品| 精品视频网| 极品人妻VIDEOSSS人妻| 久久久久人妻精品| anquye五月| 亚洲色色色色色色色色色| 青青999| 在线观看免费人成视频无码| 婷婷99狠狠| AV成人在线播放| se99视频| av人人操| 清色五月天| 开心久久五月天| 91久久1118| 五月婷婷九九热| 十二区无码| www久视频com| 性无码专区无码| 日韩啊啊啊| 97人人干人人操| 天天干天天做| 拳交大逼| 五月之婷婷| 小视频一区| 色综合播放| 五月天婷婷色五月天| 色999五月色| 五月丁香啪啪激情| 超碰com| 91九色小视频| 成人色图情色成人网 www.5b5b5bcom 五月天 | 色狠狠综合| 欧美婷| 蜜乳.comcom| 中文人妻主播久久| 丁香丁香激情网| 久久婷婷六月| 色五月开心婷婷| 六月五月丁香五月欧美| 99热国产| 激情文学 综合 色| 久久这里这里有精品免费视频| 六月婷婷激情图片| 99热国产精品| 婷婷丁香五月亚洲欧美| 91婷婷| 色婷婷99| 亚洲视频a| 丁香激惜男女| 伦乱美欧| 欧美婷婷五月激情| 人人干人人操人人摸人人做| henhencao国产在线| 婷婷热婷婷色| 五月丁香六月合| 人妻操在线看| 五月天婷婷婷| 99精品无码| 九九久久99精品免费观看www| 丁香九九九九| 五月天综合婷婷| 婷婷五月成人| 欧美成人AAA片一区国产精品| 国外亚洲成AV人片在线观看| 婷婷中合| 色播色丁香五月| 欧美色碰| 九九九九综合| 天天日综合网射| 久久婷婷五月综合色播| 夜夜操天天爽| 2020日日干| 五月天婷婷激情在线色图| 人妻久久久| 色和综合网| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 丁香五月123| 久久五月激情综合| 五月天婷婷一起草| 久久这里只有精品网| 色播激情五月天| WWW,五月| 久久丁香五月| 成人婷婷色综合| 人妻中文字幕网| 婷婷色五月丁香六月欧美啪| 色必久悠悠影院| 婷婷综合爱| 91操网| 少妇人妻丰满做爰XXX| 五月婷久草| 五月婷婷黄色| 丁香五月另类小说在线阅读| 国语精品探花| 六月婷婷av| 亚洲人妻av伦理| HD久久精品视频| 久久五月婷婷电影| 天插天啪天啪天啪| 天天综合网站| 97色色色| 97干资源在线观看| 五月婷婷六月丁香综合| 日韩五月天婷婷| 久久五月天网| 九九碰九九爱97超碰| 五月婷丁香久久综合| www99热| 五月婷婷狠狠干| 99热老司机| 99年操人人爽| 26uuu精品一区二区| 五月天婷婷丁香蜜桃91| 五月婷婷视频| 成人无码髙潮喷水A片| 东京热免费视频网站| 五月色丁香综合| 亚洲视色| 激情五月天丁香| 日韩在线一级| 五月激情丁香五月宗合| 狠狠色五月天| 亚洲亚洲人成综合网络| 在线观看亚洲视频影院| 丁香五月激情六月综合| 97人人操| 伊人喵咪a V| AV堂狠狠干| 狠狠色综合久久| JAPANRCEP老熟妇乱子伦视频| 色一情一乱一乱一区9| 五月婷婷久久开心网| 亚洲成人无码网站| 日韩人妻白浆视频系列| 久久激情五月| 色色射| 99国产精品白浆在线观看免费| 久久最新色| 婷婷五月天欧美图片在线播放电驴| 第四色五月天| 亚洲婷婷婷| 热99精品视频| 精品一二三区久久AAA片| 九月婷婷激情| 婷婷五月天激情五月天网站| 亚洲精品视频在线播放| 爆乳熟女一区二区三区爆乳| 激情综合另类| 色频玖玖五月天| 婷婷情色五月| 亚洲AV激情五月综合网| 五月婷婷熟女| 国产亚洲av片| 色五月丁香激情视频| 开心激情五月天网| 99久久久久久www| 天天草天天摸| 五月综合激情久久| 婷婷五月情色| www狠狠| 91九色丨国产丨爆乳| www.婷婷五月天.com| 超碰99热精品在线| 6080av| 久热91| 丁香六月婷婷久久综合| 99热9999| 91久久色| 色狠久| 色色色色色九九九九九| 97色伦另类图片小说视频 | 99无码| 爱性综合网| 99熟女| 99九九精品| 婷婷色中文字幕| 99精品在线观看视频| 丁香五月婷婷综合精品素人| 五月婷免费视频| 99爱在线精品视频免费观看| 97超喷视频在线观看| 六月天丁婷婷| AV色色天堂中文| 五月精品免费XXX| 婷婷五月激情四射手| 丁香五月天激情综合网| 免费无码毛片一区二区A片| 亚洲舔观看| 99国产精品白浆在线观看免费| 天天日夜夜高潮| 亚洲综合五月天| 国产成人AV人人爽人人澡Va| 欧美色频| 色综合久久88色综合天天人守婷| 色色热| 高清无码一区二区三区四区| 一本道在线电影| 99色1| 亚洲永远av在线播放| 国产裸舞表演WWWW| 丁香色五月AV在线| www.狠狠| 色婷婷大香蕉| 99视频久久| 琪琪理论片| 免费视频在线观看的网站| 思思re视频在线| 亚洲黄网在线| 久久婷婷五月| 91成人看片| 婷婷五月天影院| 色综久久AV| 无码 av电影| 久久机热这里只有精品| 五月深情久久| 久久婷婷色综合| 欧美欧盟性爱网| 国产人妻777人伦精品HD| 五月天婷婷深深爱| 五月婷婷亚洲色图| 久久久久激情| 激情宗合哪里能看| 三级毛片视频| 婷婷色情六月| 免费黄色AV| 久久五月丁香| 五月天激情无码高清| 人人97操| 日韩成人AV在线| 久婷婷五月丁香在线观看| 专区无日本视频高清8| 日本操B视频| 91爱操| 欧美顶级少妇做爰HD| 97色色色色色| 亚洲av免费在线| 欧洲色区| 六月色播| 99九九精品| 婷婷综合性爱网| 丁香五月天之婷婷影院| 任你爽视频| 久久婷婷七月丁香| 大香蕉久久婷婷| 思思久久精品视频| 97丁香视频| 国产成人亚洲综合A∨婷婷| 五月丁香 啪啪啪| 国产九九一区二区三区| 丁香六月婷婷综合| 色播五月丁香| 大香网伊人久久综合| 亚洲中字AV电影在线网站| 婷婷丁香五月网| 激情涩涩网| 激情五月婷黄版| 5月婷婷视频网站综合| 丁香花五月天社区| 99日韩| 亚洲成人av在线播放| 性小说五月天|