免费国产精品自在自线-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
返回資訊列表
草草色情综合网| 99A片| 五月在线婷色| 91黄址| 大陆极品少妇内射AAAAAA| 激情5月天天天| 成人AV网站在线| 激情综合网激情五月天| 啪啪一区| 伊人碰碰碰| 激情亚洲婷婷六月| 天堂婷婷五月色| 色婷在线视频| 日韩三级视频一区二区| 欧美性生交XXXXX无码小说| 婷婷丁香五月婷婷| 婷婷五月天六月丁香| 五月婷婷综合网在线播放| 人人97操| 激情婷婷。| 五月开心网| 综合婷婷久久| 九九色逼| 婷婷五月综合在线| 天天看A片| 国产va视频| 五月色导航| 色五月婷婷av| 97人人超| 99r这里只有精品哦| 久热 91| 99碰碰中文| 国产真实乱了老女人视频| 日韩999| 天天爽天天操| 久久久91| 亚洲色综合| 国产9色在线/日韩| 99免费| 九九碰九九爱97超| 久久ab| 99综合在线| 丁香久久久| 狠狠色大香蕉| 91操操| 婷婷色五月开心五月| 欧美va在线| 91人妻视频| 六月婷五月丁香| 色必久悠悠影院| 性五月激情| 97操操操| 精品人妻久久久久久久| 开心五月天激情网| 久久这里有精品| 深爱五月激情五月| 日韩在线视频9色| 亚洲狠9| 国产五月视频| 日本va欧美va欧美精品88| 久久婷婷一级片| 久久这里只有国产视频| 国产性爱一级| 色色色综合网| 国产人人操| 日韩精品电影| 九九视频这里只有精品在线播放 | 99在线精品免费视频| 天天做天天爽| 99热全是精品| 久热这里只有国产| 激情www| 丁香五月在线自慰| 4438亚洲欧美| 国产操碰| 五月深爱网| 五月天天久久香| 中文字幕成人| 婷婷日韩| .操區COm| 熟女网站久久| 91免费啪视频| 99re热精品视频国| 五月天 婷 欧美亚洲| 99re热视频这里只精品| www.爱婷婷.com| 久久婷婷网站| chaopengdaxiangjiao| 五月天天综合网色婷婷| 五月噜噜噜色综合| 伊人网大香| 婷婷丁香六月| 亚洲网视屏| 狠狠999| 五月婷婷真爱激情网| 丁香婷婷网| 久久久久久久久久久久久9| 婷婷五月天涩涩| 激情婷婷丁香五月天小说| 天天干天天 亚洲| 综合网五月| 婷婷五月综合激情| 婷婷久久性爱| 色婷婷五月视频| 激情五月六月婷婷| 丁香婷婷性爱| 九月av| 色婷婷在线电影| 大香蕉伊人99| 99综合视频| 在线理论片| 另类视屏| 色五月大| 在线看黄色| 婷婷五日b| 99热免费| 日本毛片内射| 强伦轩人妻一区二区电影| 五月婷婷色| 五月天啪啪啪| 日韩啪图| 激情深爱综合网| 国产特级毛片AAAAAAA高清| 婷婷五月综合色拍| 色五月婷婷操逼| 91在线视频观看午夜福利| 亚洲天堂99| 五月天婷婷综合免费| 超pen个人视频97| 啪啪综合| 久久五月丁香婷婷| 色噜噜综合网| 天天天天操| 99九无网码| 色五月婷婷一二| 琪琪色综合网站| 婷婷亚洲五| 久久婷婷五月综合| 天天色一道本综合婷婷| 五月色综合| 五月天色图| 98永久精品| 欧美碰碰碰| 婷婷综合色五月天| 91久久九色| 久久婷婷五月综合色和| 国产免费一区二区三州老师F1F1……| 欧美五月婷婷| 91干| h在线看免费版在线看| 一起草av| 亚洲情综合五月天| 国模狼狼| 26UUU精品一区二区| 日韩激情网站| 大香蕉伊人99| 久久AAAA片一区二区| 99热这里只有精品免费| 成人网丁香五月| 久久se 综合网| 亚洲经典小视频| 九九热内射| 亚洲噜色| 五月婷婷色播| 亚洲乱码日产精品BD| 成人久久天天x资源站| 亚洲无AV在线中文字幕| 五月花激情| yw.av| 婷婷精品性视频| 丁香五月97视频| 99热97| 久9久9热久热| 97夫妻超碰| 婷婷五月综合啪| 99国产欧美视频| 婷婷五月影院| 丁香五月天人体| 黄网在线免费| 亚洲综合五月天婷婷丁香| 久久综合干| 五月丁香啪啪| 怡红院一二三| 丁香五月婷婷综合视频| 色欧美日| ...婷婷国产成人亚洲日韩| 天天操天天插| 爱久综合| www.丁香五月| 这里只有在线精品| 色你久久| 色婷婷亚洲综合网站| 九九大香视频| 激情五月丁香综合网站 | 亚洲网视屏| 婷婷导航| 欧美在线干| 提提热五月天婷婷| 九九精品网站| 色综合视频| 午夜不卡久久精品无码免费| 手机旧版看人妻1025| 思思99热热热99| 九九色情网站| 久久激情视频| 亚洲五月婷| 五六月丁香激情视频| 1024操逼视频| 婷婷丁香91| 五月丁香激情综合| 久久性爱视频网站| 91婷婷在线| 日日懆天天懆| 激情丰满熟妇五月| 开心五月天私房婷婷| 99日韩| 日本五月婷婷久久久六月丁香| 123日本不卡在线| 日本高清久| 久久婷婷五月综合啪| 亚洲午夜视频| 色一情一乱一乱91Av| 99国产精品久久久久久久久久久| 色婷五月天| 久久ab| 密黄站| 大香蕉婷婷丁香视频在线| 九色综合网| 开心激情婷婷| 天天天干夜夜夜操| 5月丁香啪啪啪| 999热这里只有精品| 99视频精品全部免费 在线| 丁香色五月 97干| 熟女国产在线一区二区三区四区| 中文字幕无线久必| 男人操女人高潮91视频| 激情内射人妻1区2区3区| 久久婷婷热| 精品久久久人妻| 99视频在线观看欧| 99色1| 六月色日韩| 国产在线黄色| 婷婷丁香射射| 操国产人妻| 亚洲激情综合| 婷婷AV丁香| 久久99这里只有精品| 激情久久久久久| 五月天婷婷视频| 伊人五月成人| 五月天婷婷色| 天天肏视频| 丁香五月手机在线| 五月丁香六月婷婷网| 五月丁香婷婷色| 色综合久久天天综合网| 中文AV网| 日韩性爱AV| 午夜无码熟熟妇丰满人妻| 欧美在线视频99| 亚洲乱码精品久久久久..| 啪啪一区| 99热欲| 狠干综合| 久久网日本| 99爱爱| 亚洲夜五月| 色狠狠999综合网| 丁香六月狠狠| 国产午夜一区二区三区| 九久9精品| 五月婷婷之综合激情| 97人人草| 日本eVa一区=区视频| 蜜臀av 粉嫩av 懂色av| 美女激情综合| 激情开心五月亚洲| 另类激情五月| 国产性av| 夜夜爱伊人| 俺也去婷婷五月天第五色| 五月在线婷色| 久久久天天啊| 国产毛片欧美毛片久久久| 另类丁香五月天区图| 九九Y精品热播| 国产精品人妻在线网址| 色综合天天网| 99热播放| 亚洲天堂AV综合网| 26UUU成人网| 26UUU精品一区二区Com| 亚州操操| 91国产精品视频播放| 五月天另类图片区99| 91碰碰| 久久成人精品视频| 99在线观看| 日韩黄色影院| 激情综合5| 久久人人人人妻| 99精品一二三四视频| 天天日天天爽| 色婷婷五月色| 99re热视频这里只精品5| 激情五月综合婷婷| 色五月激情综合| 精品视频99看在线视频| 99久久99九九九99九他书对| 婷婷五月丁香人妻无码高清| 情情五月天色| 日本天天色| 91婷婷在线观看| 99热6这里只有精品6| 色噜噜狠噜噜视频| 亚洲综合五月天婷婷| 五月丁香精品| 婷婷射综合| 青青草青青草五月天| 色色色综合色| 99视频网址| 激情五月天久久| 只有精品视频在线观看| 99日本在线| 色色草97| 九九久热| 婷婷五月激情视频网| 美臀自射自家人妻| 五月激情综合网| 成人AV中文字幕| 狠狠色五月| 丁香成人五月天| 婷婷成人AV| 99这里只有精品99| 91丨九色丨老熟女激情| 色欲天天综合| 9久9久9久女女女九九九一九| 色天天久婷婷| 天天天天干| 色色激情五月天| 五月亭亭开心网| 色色97丁香婷婷五月天| 五月天激情亚洲| 五月婷婷爽爽爽| 在线国产精品色| 久色网址| 成片免费播放| 天天操夜夜操| 五月天色官网| 日本91在线播放| www婷婷色情网| 色婷婷五月综合| 丁香五月天欧美成人| 久久久婷| 狠狠五月丁香色婷| 日韩不卡123| 日逼免费视频| 97日本在线| 丁香桃色网| 婷婷综合另类| 日韩高清成人| 噜噜色五月| 婷婷成人视频| tingtingzonghewang| 极品人妻VIDEOSSS人妻| 婷婷丁香人妻天天久久| 激情图片久久| 狠狠色噜噜狠狠狠狠综合| 大香蕉九九| 99爱爱| 免費亭亭成人| 人人综合色| 99热这里精品| 97人人操人人爽| 久久婷婷亚洲| 婷婷久久亚洲| 操人91| 91丨九色丨东北熟女| 色婷婷婷婷成人网| 停停六月 综合| 91se在线观看| 亚洲五月天天| 在线91日韩| 婷婷五月情| 婷婷五月天色丁香| 手机在线视频观看9| 婷婷丁香六月天| 丁香五月首页| 成人性生活免费观看。| 丁香五月婷婷基地| 青草激情在线| 99天堂网| 色综合久久88色综合天天| 色五月偷偷| 日本狠狠爽| 色情婷婷久久五月天| 在线观看av网站| 婷婷五月天伊人在线| 亚洲AV成人精品网站在线播放| 五月天婷婷丁香导航| 99re6热在线精品视频播放速度 | 不卡在线超碰| 激情丁香六月| 99色免费视频| 激情深爱综合| 五月丁香花视频| 夜精品无码A片一区二区蜜桃| 久久美女五月天| 99爱视频免费| 操骚货在线| 九九视频精品这里只有| 99网址在线看| 热久91| 色五月丁香五月| 久久激情五月婷婷| 99精品无码网站| 自拍偷窥99热| 99超碰在线免费| 99国产精品久久久久久久久久久| 91seav| 久久er99| 丁香六月爱综合| 人人操日| 全高清无码视頻| 超碰熟女农村在线69| 成年人丁香五月| 亚洲另类视频| 怡红院一二三| 26uuu欧美激情另类| 激情婷婷| 久久久久9| 亚洲精品成人片在线播| 午夜]香婷婷深深爱| 久久人妻精品| 久久婷婷精品| 99热亚洲| www.超碰在线| 五月婷婷五月天| 九九热自拍| 婷婷射丁香| 五月丁香婷婷伊人| 婷婷丁香五月天亚洲| 99热在这里只有免费精品| 黄网免费看| 97久人人| 久久久宗合| 97在线日本| AV操一操| 久草丁香婷婷五月天婷| 久久天堂婷婷五月| 9久久AV| www.刺激色网站www.| 99久久超级| 超碰只有精品在线| 99热这里只有精品最新| 色噜噜狠狠狠综合曰曰曰| 五月丁香啪啪拍| 热这里只有精| 99成人无码| 色五月天综合| 丁香五月六月激情久久| 婷婷五月天久久| 99在线观看精品视频| 婷婷婷婷婷婷婷五月丁香| 色综合色综合网| 丁香色综合| 久久婷婷五月综合色和| 五月天色综合| 99综合网| 国产av天堂| 国产免费性爱| 久久久久久18| 美女黄频aⅴ视频| 色婷婷综合久久久久| 色播六月| 26uuuavcom| 色五月视频,小说| 久久婷婷五月综合色丁香| 六月丁香成人网| 99精品综合| 超碰在线免费| 日日影院 | 色99久草在线| 99激情网| 五月丁香色播| 婷婷丁香六月天| 99热这里只有精品1025| 亚洲精品国产A久久久久久| 人人摸人人干| www.久久久久久久| 久热这里精品免费| 色色五月婷婷久久| 五月婷婷内射网| 伊人深爱综合| 五月激情婷婷丁香| 婷婷综合玖玖五月| 欧美日韩一a.无| 最新亚洲色色网| 丁香五月天之婷婷影院| 色久综合| 免费播放片大片| 人妻性爱| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 久久在线视频只有这里有精品| 五月天婷爱综合| 99精彩视频| 久久久18| 免费亚洲成人电影AV| 日日爱678| 九九色视频| 超碰99在线观看| 亚洲黄色网址| 精热在线综合网| 色99欧洲色19| 九九色精品| 婷婷久久图片| 白天AV月月| 欧美日比视频| 伊人大香蕉爱聚| 亚洲国产精品成人免费一区久久久在线观看AAAA | AV在线收看| 99热这里只有精品26| 丁香网五月天激情| 99热精品在线| 九九亚洲视频| 97色色视频| 人妻熟人中文字幕一区二区 | 色七七色九九| 欧美97超碰| 久操操| 爱狠射| 伊人成人宗合网| 91精品久久久久久久| 超碰97在线观看免费| 丁香五月综合高清在线| AA久久| 久久一操| 久久性爱视频这里只有精品 | 噜噜噜噜在线| 色99视频| 激情五月综合色| 天天肏天天肏天天肏| 嫩模草| 天天色天天爱天天舔| 免费AV播放| 人人性久久| 五月婷婷六月丁香在线视频| 九月激情婷婷丁香| 夜夜夜夜做天天天做无码视频| 五月天丁香网| 99re热99| 丁香五月首页| 99热老网站| 在线观看免费狠狠色丁香香综合| 综合超碰熟| 激情五月丁香六月综合AVXXXX| 国产午夜成人AV在线播放| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 天天操人人干| 激情综合五月激情XXXX| 五月丁香六月激情| 丁香激情五月| 国内婷婷丁香社区在线播放| 五月天久久久| 亚洲色小说在线综合| 伊人综合网站| 久久人妻高清中文| 亚洲在线成人| 亚洲成人无码网站| 久久伊人五月天| 亚洲色综合| 免费AAAAA网| 97精品综合久久| 色色综合日韩| 99国产99| 五月丁香综合中文| 99热精品在线| 性做爰1一7伦| 99免费视频在线观看爱| 色婷婷瘦婷婷日韩| 婷婷丁香五另类网站| 丁香婷最新动态| www.夜夜| 五月丁香啪啪伦理电影| 日韩99视频| 久99| 激情网开心网| 9热在线观看| 五月婷婷六月丁香| 第一区久久网站| 天堂网亚洲色图| WWW.桔色成人.COM| 五月丁香激情五月天| 久久A极片| 婷婷丁香成人五月天| 六月大香蕉| 激情綜合W W W,激情五月天| 五月四色婷婷| 黄色精品五月婷婷| 日本精品人妻无码77777| 婷婷激情社区| 欧美狠狠草| 久久精彩视频18| www.91九色| 婷婷 激情 五月| 97AV人人插人人操| 五月丁香啪啪网| 久久视频这里99| 九九碰九九爱97超| 91久女| 婷婷五月花| AV国产有码| 国产精品成人AV在线| 国产精产国品一二三在观看| 婷婷五月天AV| 思思99re这里只有| 92久久| 九九婷婷热| 亚洲中文字幕网| 五月婷婷五月天亚洲无码| 久久人人九九| 日本玖玖在线| 久久er99热精品一区二区| www.色五月| 婷婷五月天六月综合| 丁香五月手机在线| YW无码| 国产又粗又大又爽又黄| 久久性爱视频| 婷婷五月激情中文字幕| 五月色精品| 五月婷婷高清| 区美毛片子| Av免费网站在线| 在线观看免费视频| 这里只有精品视频免费在线观看| 九九激情| 成人 在线 日韩| 特黄三级又爽又粗又大| 色婷婷91激情小说| 琪琪色五月天| 婷婷久久图片| 五月丁香久久激情综合| 伊人综合网站| 色五月婷婷久久| 日本三级中文字幕| 五月综合激情| 五月婷婷丁香五月| 色五月人妻| 五月激情网络| 久热中文字幕在线线观看| 天天 青草 制服丝袜 在线| 操日视频| 五月婷婷七月丁香| 激情五月婷黄版| 91av无码| 秋霞少妇毛片| 婷婷中文网站| 国产小网站| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 国产看真人毛片爱做A片| 亚洲五月婷婷| 亚洲操人| 中国丰满熟女A片免费观| 丁香五月天堂| 大香蕉伊人久久| 桃色五月天| 丁香五月欧美| 婷婷成人五月天| 久久五月婷| 99热在线观看| 五月丁香本色在线观看| 丁香五月综合网| 国产性爱大片久久| 六月激情网| 99色在线观看视频| AV在线免费播放| 丁香五月天啪啪| 97色色-99久久| 99热久只有| 午夜不卡成人一区二区| 久久久精品人妻录| 色婷婷久久| 91人人网| 97香蕉碰碰人妻国产欧美| 丁香六月天| 日本黄色三级片内射| OYIWbGcPu8H| 91日精品| 欧美激情丁香五月| 人人天堂操| 色小说五月天| AV在线免费播放| 天天插天天射| yw国产AV| 97人人操人人| 色欲日日躁| 怡红院一二三| 九九色精品| 久久人妻熟女一区二区| 色色丁香色五月| AV在线观看网站| 99热在线99| 狠狠激情五月天| 中文AV在线播放| 中字幕视频在线永久在线观看免费| 婷婷五月五月丁香| 婷婷五月综合社区| 操逼在线视频| 欧美在线操| 久久精品A片777777| 日日噜噜久久婷婷五月天| 五月天堂婷婷| 少妇人妻凹凸视频| 丁香色综合| 久久无码成人| 综合色播| 五月丁香六月婷婷国产视频| 狠狠色综合网| 丁香五月黄色| 色狠狠六月| 丁香五月综合激情啪啪| 日韩AV中文在线观看| 久久性刺激| 中文字幕簧片| 9久视频| 中文字幕91,综合| 色婷婷成人丁香| 夜夜操狠狠操| 一级A片天天操夜夜操| 日本欧美国产| www狠狠爱com| 色九月激情综合网| 99热在这里只有精品| 韩国97天堂| 九九这里只这里只有精品| 五月丁香六月婷婷久久肏| 99燥99日| 婷五月丁香俺| 天天射美女| 婷婷丁香综合色AV| 亚洲另类久久| 中文成人在线| 久热超碰| 91在线日| 婷婷五月丁香超碰| 开心色五月天久久久久久久| 青青青在线视频国产| 婷婷99狠狠躁天天| 热五月婷婷| 综合 蜜月 婷婷| 五月丁香六月综合激情网| 久热9| 婷婷精品免费久久| 97性视频| 男人的天堂五月丁香| 五月伊人婷婷| 久久婷婷五月综合网| 蜜乳A√| 久草婷婷| 久久这有这里精品| 丁香五月久久| 色综久久AV| 人人操AV| 丁香五月网络网络| 婷婷伊人网| 亭亭丁香aV| 五月婷婷激情综合网| 亚洲综合五月天婷婷丁香| 九月综合| 99久在线观看| 五月丁香免费视频| 狠狠操综合| 成人丁香五月天| 中文字幕在线观看视频www| 久久停停超碰| 色狠狠狠干| 99热这里有精品| 六月丁香五月婷婷首页| 亚洲精品99| 99色在线观看| 99 这里只有精品| 极品精品一区二区三区在线| 天天成人综合视频| 丁香婷婷激情四射五月| se影音资源在线观看| 婷婷五月激情视频网| 久久538| 亚洲激情综| www久| .操區COm| 日韩成人中文| 亚洲婷婷免费| 97色婷婷五月天| 久草热在线视频| 六月伊人婷婷| 热99热久| 成人电影在线免费试看| 九九国产精视频| 成人无码髙潮喷水A片| 五月网网站| 色播播婷婷| 久久这里只有精品热在99| ji'qing'luan'ren'lun| 色播激情| 色五月婷婷在线| 琪琪理论片| 五月天啪啪网| 五月丁香婷婷久久| 亚洲丁香五月深爱五月| 无码人妻一区二区一牛影视| 99精品在线观看视频| 久久色五月天| 丁香五月激情啪啪啪啪| 婷婷五月丁香综合| 五月色天五月色| 午夜丁香六月婷| 狠狠操综合| 五月天久久网站| 97人人超| 丁香婷婷五月综合欧美另类| 91精品久久久久| 五月丁香伊人网| 久久丝袜婷婷| 99原创自拍视频在线观看| 爱草人视频| 五月色婷婷综合色| 色原狠狠综合| 亚洲中文字幕在线观看| 天天干一干| 五月婷庭丁香在线| 香蕉久久六月| 91色五月在线观看| 97人人草| 这里只有精品在线视频在线观看| 久久久久久久丁香五月天婷婷| 男女av免费看| 人人摸人人干| 欧美性猛交99久久久99| 思思热再线视频| 久久激情视频| 激情综合在线播放| 先锋影音av色五月天资源站| 9+1视频网址| 丁香六月五月天| 五月激情网五月综合网| 99亚洲精美视频在线观看| 欧美成人猛片AAAAAAA| av在线观看网站| wwwwww.色| 青青热久精品视频在线观看| 亚洲在线综合| 亚洲AV无码成人精品电影| 国产精品成人AV在线观看春天| 99热亚洲| nvrentiantang av| www.热99热| 开心激情色婷婷五月天| 超碰91在线| 99人妻碰碰碰久久久久视| 人操综合| 久久精品国产AV一区二区三区 | 五月天亭亭俺也| 99re这里有精品手机在线| 婷婷五月天美女| 国产在线黄色| 久久色五月| 91日精品| 2021日韩无码| 色婷婷五月丁香色| 狠狠操狠狠色| www.99热国产| 日本精品人妻无码77777| 五月婷婷丁香六月| 俺去也五月| 另类视频一区| 婷婷色中文字幕| 亚洲综合久| 91九色丨国产丨爆乳| 激情五月综合亚洲另类| 婷婷性福五月天| 色综合伊人网| 激情五月天色播| 狠狠操狠狠插| 啪啪色区| 狠狠色噜噜狠狠狠狠综合| AV色婷婷| 丁香六月久久| 中文字幕在线日亚洲9| 婷婷伊人久久| 色欲久久综合| 久久久久久人妻| 中文字幕成人| 丁香五月骚喷水视频| 丁香六月婷婷开心| 久久久久综合激动五月天| 免费精品66| 色婷丨日丨天丨综合久久| 色婷婷色五月丁香| 欧美婷婷五月| 激情五月天在线视频| 丁香六月婷婷综合| 另类精品视频在线观看| 亚洲欧美成人在线| 六月丁香网| 亚洲蜜桃精久久久久久久久久久久 | 97日在线视频| 亚洲啪视频| 激情精品久久| 66精品成人免费网站在线观看| 激情五月婷婷老师| 性综合网| 大香蕉婷婷| 国产成人精品一区二区三区视频| 清纯唯美 激情四射| 亚洲av成人一区二区电影在线| 国产99久9在线| 在线婷婷| 色五月开心五月激情五月| 五月天激情婷婷小说| 可以看的av网站| 九九Av| 国产五月视频| 久久综合播放| 色婷婷中文字母五月丁香| 婷婷四色成人综合色视| 日本3级片一区2区| 丁香五月天堂网| 热久91| 激情五月天视频| 六月婷婷亚洲| 婷婷五月天堂| www,奇米影视| 原琪琪色影院| 婷婷五月天99| 九色91视频| 国产伦亲子伦亲子视频观看| 99爱爱网| 色婷婷五月天天天做| 国产成人亚洲综合A∨婷婷| 婷婷五月丁香六月| wwww.色婷婷| 婷婷丁香六月综合激情站| 五月天色裸体视频| 色色色图| 日本理论久久| 婷婷六月丁香色| 九九这里是免费的视频5| 日韩中文字幕| 9久久婷婷国产综合精品性色| 五月婷婷co.m| 婷婷五月色综合| 九九色婷婷五月天| 久久婷色| 婷婷丁香五月色| 国产偷人爽久久久久久老妇APP| 99啪在线| 激情五月天网页| 色综合久久888| 天天综合网色欲香| 日韩一区二区三区无码| 嫩草视频在线观看| 99精彩视频在线观看| 丁香五月综合久久八| 色香久久| 激情婷婷五月社区| 亚洲视频丁香网va| 婷婷久久网| 99热全是精品| 亚洲色综合性| 午夜性做爰电影| 天天色播| 亚洲成人中心| 影音先锋AV男人站| 91婷婷五月天综合视频| www夜夜| 五月丁香久| 五月天六月色| 九久热| m色激情网| 五月综合激情婷婷六月色窝| 婷婷色中文字幕| 丁香五月av| 超碰97色| 99热这里只有精品18| 国产午夜伦鲁鲁| 五月伊人综合| 婷婷丁香五月天激情| 久久五月网| 色色五月天丁香婷婷| 九九超碰人人| 99国产视频网| 丁香影院五月综合| 亚洲色无码| 久久九网| 久久精品66| 久久久婷婷五月天| 五月丁香六月婷婷a v| 人妻丰满精品一区二区A片| 色五月婷婷狠狠撸| 99re在线观看| 欧美色骚婷婷五月天| 五月婷色| 欧美综合激情五月丁香| a网站免费观看| 亚洲视频在线观看99| 六月丁香婷| 国产色色网站网址| 日本不卡一区二区三区| 激情婷婷狠狠干| 色综色网| 色色色色网色色网色色| 久久久噜噜噜操操操| 丁香狠狠色婷婷久久无码视频| 啪啪啪丁香五月| 国产婷婷五月色情综合| 青青日韩| 超碰在线免费| 丁香无月在线观看| 激情五月激情综合网| 青青草蜜臀| 青吴乐视频| 丁香五月天啪啪| 人人干99| 激情五月影院| 26UUU欧美激情一区二区| 亚洲精品a成人在线播放| 夜夜做夜夜愛| 国产九九一区二区三区| 亚洲欧洲国产精品| 五月婷婷丁香成人网| 国产精产国品一二三在观看| www.丁香五月| 色99自拍| 天天操夜夜操| WWW,五月| 婷婷伊人网| 久久久国产精品黄毛片| 婷婷六月激情在线视频| 一月婷婷色色| 91丨九色丨东北熟女| 大伊久久| 六月丁香停| 激情视频网址| 九九久热| 九九香蕉网| 超碰婷婷色| 狠狠爱婷婷| 色婷婷成人影片| 日本天堂久久| 色五月婷婷五月| 激情色视频| 天天肏视频| 丁香五月激情图片婷婷| 久久色五月天| 五月天婷婷丁香花| 亚洲精品中文字幕成人片| 色欲一区二区三区精品A片| 狠狠狠狠操| 色五月琪琪| 人人摸人人干| 色色五月婷| 婷婷情色激情| 色婷婷综合网| 狠狠 久久| 婷婷91| 六月婷婷五月丁香| 清色五月天| 亚洲在线操| 超碰妻人人| 99视频| 能看的AV| 人妻肉射免费观看| 狠狠色婷婷777| 色综合色色色色色色综合| 丁香五月综合| 色婷另类| 这里只有精品9| 婷婷的激情五月| 婷婷丁香五月91| 婷婷综合中文| 欧美精品18| 综合五月丁香六月婷婷| 婷婷五月AV| 丁香五月婷婷无码AV| 五月天婷综合| 亚洲美女裸体被操在线观看| 色欲久久综合| 99久在线观看| 九九视频这里只有精品| 千人斩操逼| 婷婷五月天色色| 超级碰碰碰碰视频| 婷婷丁香精品视频在线观看| 97人人草| 色色五月天婷婷| 久久怡红院| 日日爱激情| 第四色婷婷五月| 熟女重口味αV| 丁香五月天啪啪| AV色婷婷| 欧美日韩五月婷婷| AV大片在线观看| 超碰九热| 国产,欧美,学生妹,视频| 色噜噜狠狠色综合日日| 婷婷九月色| 五月丁香久久网| 超碰在线免费9| 婷婷五月激情中文字幕| 桔色成人在线| 深爱激情网五月天| 99re思思精品在线观看| 丁香六月色情| 综合xx网| 视色网在线播放| 韩国情人在线电视剧免费观看高清版全集| 国产激情AV| 五月婷婷丁香综合| 久久人人超| 91九色丨国产丨爆乳| 婷婷少妇激情| 97精品在线| 亚韩在线视频| 丁香六月久久| 国产成人+综合亚洲+天堂| 99操中文视频| 色色丁香| 天天做天天爱天天日| 99,色| 久久欧洲久久| 26uuu美女三级视频| 激情五月天综合图片小说网站| 久久这里面只有精品视频| 色五月婷婷丁香国产在线| 草操网| 色丁香久综合在线久综合在线观看| 五月婷综合性中心| 麻豆五月丁香婷婷| 五月五婷婷| 色色五月天婷婷丁香| 99激情在线| 六月丁香网| www.五月天| 色婷婷呢狠禁久禁| 婷婷激情五月天激情小说| 久久99久久久久久久噜噜| 大香蕉伊人爱在线| 久久九九爽| 日韩成人五月天| 淫荡综合网| 久久人人妻| 婷婷91| 国产日韩欧美| 人妻免费网站| 无码yw| 五月天婷亚洲天综合网综合| 五月天色在线| 五月丁香色婷婷| 婷婷亚洲天堂| 九九99九九精品免费 | 丁香五月婷婷激情中文| 丁香久久综合| 丁香丁香激情网| 五月天激情视频网站| 99超级碰碰| 亚洲无码色| 日韩AV在线电影| 久久综合爱| 激情 婷婷 插| www.婷婷,com| 91啪啪| 色色色色色色色色色色色色色五月天| 婷婷99狠狠躁天天| 九九久久99| 玖玖五月丁香| 久久小视频| 2022人人操人人看| 99这里只有免费的精品| 五月天综合婷婷| 激情五月天 婷婷| 婷婷99狠| 99久久久国产大片| 99精品小视频| av九九| 停停综合色色| 色婷婷色久综| 中文AV在线播放| 色播jjjj| 五月天亚洲图片婷婷| 曰日爽日日操| 大香蕉综合在线| 色99无码| 5月婷婷激情6月| 婷婷九月激情| 五月天另类小说久久小说网| 国产亚洲色婷婷久久99精品91| 亚洲精品国产精品乱码不99| 婷婷五月天亚洲| 色99免费视频中文| 亚洲无码成人性爰网| 色婷婷欧美| 色色综合热| 日日干日日s| 婷综合| 色色五月丁香婷婷综合| 婷婷色天香| 操一区| 9婷婷内射| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 九月色婷婷综合亚洲| 思思热思在线精品视频| 五月丁香久人妻中文| 久久婷婷五月综合色和| 安息电影在线观看完整版| 婷婷五月激情图片| 九月大香蕉| 亚洲va欧美va国产综合久久久| 人妻22p| 亚洲AV网址| 综合精品99| 激情五月天www| 爱久久小说下载网| xxxx五月| 伊人五月天在线| 久久女人天堂| 亚洲99在线| 色99超碰| 色色色国产| 婷婷综合性爱网| 五月婷婷色丁香| 26uuu国产| 婷婷亚洲五| 97色色色色色| 亚洲成人AV在线观看| 七七色色综合| 色婷婷色| 婷婷五月色情天| 99五丁香月| 丁香五月婷在线观看| 亚洲六月综合激情久久下卡| 婷婷深爱五月天在线| 中文字幕无码人妻少妇免费视频| 丁香婷婷久久| 人人摸人人搞| 五月天激情小说| 日本五月婷| 99er日韩| 天天拍天天操| 都市激情久久| 亚洲精品99| 丁香六月亚洲| 日本少妇裸体做爰高潮片| 插少妇综合网| 欧美五月停| 色5月婷婷| 久久久久视剧HD| 婷婷久久亚洲| 色婷婷狠狠色| 五月天狠狠干| www.久久久久久久久久.com| 99九九精品视频| 婷婷香蕉视频|