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
返回資訊列表
五月天 婷 欧美亚洲| 久久五月丁香| 五月天色色色色色| 五月天狠狠色| 日韩黄黄| 日日干天天射| 综合丁香婷婷五月天| 丁香五月成人| 97色伦另类图片小说视频 | 五月天堂在线| 五月婷婷9| 天天干狠狠| 久久综合香蕉国产国产蜜臀AV| 永久地址 色| 99热 日韩| 俺去也在线www色官网| 超碰在线看| 丁香色综合| 日韩操逼大片| 六月丁香深深爱| 九九热123| 亚洲五月天婷婷在线| 精品香蕉99久久久久网站 | 久久只有这里精品免费| 色播五月天激情| 久久97| 色播婷婷大香蕉| 婷婷丁香社区| 欧美日韩aaa| 久久五月婷| 一起草AV| 亚洲99精品欧美一区| 99热很操老逼| 色综合99| 伊人久久丁香婷婷六月五月综合| 色婷婷丁香女女| 久久五月天激情| 国产免费一区二区三区三州老师F1F1.CC| 丁香六月啪啪啪| AV在线中文| 超碰久热| 色狠久| 91avse| 婷婷伊人中文字幕| 99热99re6国产在线播放| 91丁香婷婷综合资源| 97超碰在线免费观看| 五月激情综合网| 这里只有精品视频| 天天日天天爽| 婷婷四色五月| 五月丁香美女视频| 色婷婷成人做爰A片免费看网站| 热99视频| 丁香色婷婷| 亚洲妇女熟BBW| av人人干| 天色综合网站| 激情综合五月天| 99精品偷自拍| 欧美超级视频97| 五月丁香激情五月天| 五月天丁香婷婷网| 久久久婷| 99热r| 日韩黄色中文字幕| www.久久| 婷婷 色 丁香 夜| 婷婷丁香色五月亚洲| 91无码一区人妻A片蜜| 激情五月天色播| 4399在线观看免费高清电视剧| 97亚洲视频在线| 成人网址在线观看| 天天综合社区| xxxx久| 五月天开心激情综合网| 久久99网| m色激情网| 婷婷丁香五月天影院 | 高清一区二区三区日本久| 夜夜夜夜夜骑撸| 久婷婷婷| 九热视频免费观看| 日本美女97在线视频| 99在线观看视频蜜臀| 99精品视频推荐| 超碰在线观看9| 国产欧美日韩性爱| 亚洲黄3级片网站欧美| AA片在线观看视频在线播放| 丁香六月婷婷综合| 色色婷| 亚洲欧美一区二区三区爱爱动图| 久久婷婷五月天激情| 操一区| 91主播在线| 99热这里有精品| 久久婷婷成人| 中文字幕av在线| 五月天色婷婷伊人网| 九九热a| ...婷婷五月综合不卡,国产在线手机| 丁香五月激情综合久久| AV在线不卡播放| 26UUU欧美| 色色色色热| 四五月婷婷| 大香蕉综合网| 天天久久人人| 五月婷丁香| www.久久爱.c n| 99热在线观看成人| 亚洲av另类在线观看| 怡红院精品视频久久久久久久久| 亚洲中文无码成人| 一区二区三区四区五区| 激情开心五月婷婷| 久久99最新| 激情五月婷婷丁香六月| 丁香五月激情婷婷视频| 亚洲色色色色色色色色色| 97色色婷婷五月天| 99ri久久| 九九日本视频| 老司机午夜福利视频金瓶梅| 99热这里只有精品国产免费| 五月丁香激情综合欧美| 五月丁香六月色婷婷综合五月天| 九九热a| 99自拍网| 青青草视频免费观看| 色色色综合网| 婷婷伊人| 亚洲经典三级| 性无码专区无码| 激情综合五月天| 婷婷激情社区| 天天做天天爱天天爽| 日本久久99| 婷婷五月激情图片| 国产成人亚洲综合A∨婷婷| 超碰国产在线观看| 欧美色五月| 久热伊人| 少妇被躁爽到高潮无码文| 欧美色综合天天久久综合精品 | 婷婷五月性感| 久久香视频| 丁香婷婷综合色五月激情国产基地| 一本到不卡高清DVD| 99热午夜精品| 91婷婷伊人牛牛| av无码电影| 婷婷九九| 五月丁香六月婷婷中文版| 五月激情网五月综合网| 九九爱激情| 丁香五月婷婷五月| 26uuu日韩| 久久久婷| 69人人操人人爽| 99热精品10| 亚洲激情综| 91chinese在线| 婷婷五月天成人动漫| 99er在线观看| 天天插天天射| 99欧美| 超碰av在| 午夜婷婷久久 | 大香蕉大香蕉在线影院| 草操网| 思思热99在线| 五月婷婷九| 天天射综合网站| 9久久精品| 性欧美大战久久久久久久83| 性爱激情五月| 黄色成人网站在线播放| 免费观看全黄做爰的视频| 久久久久9| 六月激情网| 精品国产一区二区三区四区阿崩| 色色婷婷婷丁香五月天| 久久狠狠欧美| 婷婷婷婷色| 久久亚洲天堂| 日日操夜夜骑| 五月天婷婷色小说| 99这里只有| 免费国产视频| www五月婷婷88导航| 亚洲狠狠终合停停终合| 99亚洲视频| 久热这里只有精品性色AV| 亚洲色色精品| 草草视频91| 婷婷五月天Av| 亚洲成人九九九| 激情播丁香| 碰碰女| 久久婷婷五月综合色和| 天天综合天天做天天综合| 久久XX| 日本五月天激情| 亚洲中文乱字字幕线在永久| 婷婷射综合| 成片免费播放| 丁香9月婷婷| 亚洲欧美婷婷五月色综合| 成人国产网站| 中文在线视频久1| 日韩av变天就操逼不卡区| 热的五码久久精品| 久久久人妻人伦| 六月婷婷综合久久| 色五婷婷| 国产肥白大熟妇BBBB视频 | 一本色道久久综合狠狠躁小说| 中文字幕AV网址| 91五月天| 99福利视频导航| 国产成人网站在线观看| 久久99热这里只有精品| 日本三级成人秘书精品片| 激情av在线| 996热re视频精品视频这里| 4399在线日本A片| 任你弄在线视频免费| 激情五月天婷婷| 天天色宗合| 欧美三级巜人妻互换| 玖玖综合网| 国产婷婷五月色情综合| 色啪影院| 自拍视频在线观看9| 99爱视频精品在线观看| 五月丁香色| 665566 无码| 五月丁香欧美| 色婷五月天| 婷婷人人操| 婷婷五月天在线综合| 天天日天天色| 亚洲午夜精品久久久久久人妖| 五月婷婷综合视频| 停停五月色宗合| 激情综合色五月丁香| WWW,激情五月天,COM| 99色综合| 另类在线观看视频| 夜夜撸日日操| 九九99在线| 激情伍月 欧美| 国产成人AV在线播放| 婷婷天天五月天| 婷婷五月综合国产精品| 五月色婷丁香| 啪色综合| 日本色五月婷婷| 婷婷五月丁香人妻无码高清| 婷婷情色激情| 一区=区操屄高清大全av| 色色丁香五月婷婷| 激情综合网激情五月俺也去| 天天草天天日| 久久受www免费人成| 久热最新视频 | 亚洲精品网站色视频| 婷婷午夜精品久久久| 一起草无码| 激情五月综合| 五月天久久综合| 欧美久久网| 97人人爱人人操| 久色五月丁香视频| 色五月成人| 精品久久久人妻| 开心婷婷五月天综合| 亚洲成人综合在线| 狠狠色丁香久久婷婷综合五月| 99成人精品| WWW.99热| 久久婷婷视频| 婷丁香五月天| 久久久久久久久月丁| 伊人春天av| 色色色网站| 最新午夜理论片| 五月婷婷激情综合| 伊人婷婷五月天av| 色综合狠狠色| 99视频在线精品| 99在线观看免费精品视频| 久久在线视频免费观看| 99热99热| 婷婷色五月激情强奸四射| 丁香五月欧美激情| 色婷婷88| 免费看欧美成人A片无码| 99色丁香婷婷综合网| 久久久久久婷| 色情免费视频播放| 五月天婷婷五月| 97色97干| 激情五月天在线观看婷婷| h在线看免费版在线看| 五月婷婷亚洲天堂激情在线| 亚洲五月天激情| 亚洲熟妇AV综合网五月丁香伊人 | 日韩AV在线免费| 久久这里有精品| 9l视频自拍九色9l视频自拍九色9l社区| 久久大香蕉| 色色五月天婷婷| 国产AV一区二区三区最新精品| 天天舔天天摸天天透| 怡红院AV亚洲一区二区三区H| 久久婷婷色五月| 婷婷五月天大香蕉| 大香蕉人妻| 婷婷网五月| 亚洲操B视频| 色噜噜狠狠色综合网| 狠狠色丁香99| 免费做A爰片77777| 激情五月少妇| 亚洲色碰| 特黄三级又爽又粗又大| 婷婷伊人綜合中文字幕| 婷婷亚洲五月色综合| 久久婷婷夜| 色色色色热| 岛国av电影网站| 久久久久久久久久久44| 97五月天| 婷婷大乡焦噜噜| 婷婷玖玖丁香| 婷婷五月天AV| 色综合天天| 婷婷五月在线| 狼人伊人天堂| 色色色在线播放| 色婷婷小视频| 婷婷五月天成人网| 激情六月丁香| 日在线V视频在线播放| 亚洲免费视频网站| 五月丁香六月片| 99免费热视频在线| 99精品大片| 色丁香五月婷婷婷| 97极品在线| 操逼福利视频| 五月丁香色婷婷色| 碰人人97| 成人做爰A片免费看网站找不到了| 99视频在线| 久久五月丁香综合17C| 婷婷丁香九月| 被强行糟蹋的女人A片| 成人在线综合| 五月天涩涩| 久久亚洲网| 九九综合伊人| 成人免费高清在线播放| 欧美一级毛卡片无码| 久热91| 欧美狠狠色| 69激情小说| 国产精品电影| 丁香五月综合久久| 国产精品A片在线| 丁香五月天社区| 欧美在线操| 天天日夜夜夜操操操操| 人人色人人弄人人操| 操99| 猫咪伊人久久| 99国产精品久久久久久久久久久 | 丁香五月23111| 日本精品在线噜噜噜| 日比视频91| 91欧美| 97色热| www色五月| 婷婷五月色网| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 91九色精品| 国产精品久久久久久五月天加勒比| 99综合视频在线| 超碰色色综合| 伊人激情综合网| 性爱七区| 一片AV片免费播放| 97色综合视频| 久久九九囯产| 六月丁香婷婷综合影院| 日韩操啪| 九月av在线| AA片在线观看视频在线播放| 少妇性BBB搡BBB爽爽爽视頻| 国产精品美女久久久久AV超清| 91久久婷婷| 色五月欧美| 超碰91人人操| www.99热精品| www久久艹| 五月婷婷五月天| www.婷婷.com| 人人草人人舔| 爱久综合| www.婷婷六月天| 九九热精品| 欧美激情综合色综合啪啪五月| 99只有精品| 情婷婷五月天| 色五月婷婷在线| 深爱五月婷婷| 九九色婷婷| 99精品在线观看| 五月丁香六月天| 久久五月婷| 五月丁香婷婷啪啪| 精品国产一区二区三区四区阿崩| 影音先锋 萱萱| 色天使色综合| 特级操b片| 情色五月天网站| 国产亚洲色婷婷久久99精品91| 午夜色丁香| 婷婷六月丁香色| 99爱在线| 99热99干| 玖玖婷婷色五月| 综合色播| 色色丁香婷婷| 五月丁香美女视频| 亚洲色A| 九九这里是免费的视频5| 婷婷丁香五月天大香蕉| 日韩国产在线免费观看| 玖玖综合色| 五月婷视频久久| 久久久er热| 99性感视频| 九九婷婷五月天| 婷婷五月AV| 精品婷婷| 国产女生爱爱AA| 激情 婷婷| 久99久视频| 丁香五月婷婷色综合基地| 中文字幕性爱丰满| 丁香五月婷婷亚洲综合精品| 成人精品一区日本无码网| 六六久久黄色| 99热在线精品播放| 五月社区婷婷激情| 天天操综合网| 丁香五月综合| 六月激情网| 日本成人噜噜| 久久久五月五丁香| 996热re视频精品视频| 丁香五月先锋| 五月天综合色| 色99视频| 99在线综合视频| 九九99免费视频| 激情5月婷婷狠狠干| 午夜做爱影院| 成人看片网站| 色婷婷瘦婷婷日韩| 色五月天中文字幕| 日本五月天一页| 99热精品观看| 亚洲AV在线免费看| 91啪啪视频| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 色天使久久综合| 色丁香五月婷婷| 亚洲啪啪网| 婷婷五点亚洲| 永久地址 色| 好吊操这里只有精品| 91综合色噜噜| 婷婷狠狠干| 丁香五月色播中文在线播放| 色婷婷亚洲综合av| 色综合色婷婷色伊人| 欧美婷婷九月| 婷婷激情五月天色| 人妻22p| 狠狠干最新地址| 亚洲成Av人片乱码色第1集| 美女va| 天天做天天爱| 丁香五月影| 91av色色乱视频| 欧美日韩中国| 天天射综合网天天插| 99这里有精品视频| 天堂网色婷婷| 9999色色色色| 五月天激情小说| 五月丁香婷婷啪啪综合| 午夜婷婷五月天| 色播五月丁香| 日本久久网| 丁香五月婷婷综合精品素人| 天天肏在线视频| 大香蕉九操| 五月天婷婷激情综合| 亚洲第一成人无码A片| 人妻AV在线| 天天肏天天肏天天肏| 色综合久久8| 色五月五月丁香| 五月激情综合网| 97碰碰在线观看视频| 婷婷五月六月丁香综合| 国产AV一区二区三区最新精品 | 日本丁香五月| 色色色99| 开心激情网在线| 51精品国自产在线| 五月丁香久久久日婷婷久久婷婷日| 精品久热| 精品成人久久久久久久_一二三四视| 99热只有| 婷婷六月综合基地| 日本婷色| 五月丁香婷婷综合视频| 激情99| 婷婷六月丁综合| 久久欧洲综合网| 久草热8精品视频在线观看| 精品一二三区久久AAA片| 九九色影视| 婷婷月综合| 亚洲中文AV| 天天成人综合视频| 激情98色婷婷五| 包操45分钟网站| 人人干99| 欧美日比视频| 色玖玖综合网| 丁香五月婷婷久久综合激情网| 色综合网址| 大香蕉九操| 夜夜 操无码| 超碰激情网| 成人五月丁香社区| 婷婷五月成人| 天天干,天天日| 五月永久激情| 国产av第一专区| 色五月激情婷婷| 婷婷五月a| 五月婷婷色| Www99热| 成人五月天丁香| 婷婷黄色| 全部老头和老太XXXXX| 天天干天天操天天上| 亞洲自怕| 久久丁香综合| 中文字幕在线资源| 丁香激情网| 日本99热| 大香蕉婷婷丁香天堂AV| 激情小说婷婷小说| 日曰躁夜夜躁2026| 色婷婷婷婷| 亚洲婷婷五月| 99热这里只有精品青草| 夜夜夜叫天天天做| 亚洲妇女熟BBW| 一本综合丁香日日狠狠色| 婷婷丁香婷婷97| 97碰碰在线观看视频| 五月丁香亭亭操逼| 国产精品久久久久久久久久| 婷婷影视久久| 99热亚洲| 久久婷婷五月天激情新地址| 五月丁香欧美综合| 9福利性视频欧美| 五月婷色色| 五月婷婷六月丁香激情综合网| 激情AV网| 色五月婷婷网| 婷婷五月天综合激情| 中文字幕无码人妻少妇免费视频| 婷婷五月丁香手机在线视频| 97香蕉久久超级碰碰高清版| 国产精品久久欧美久久一区| 久久婷婷综合五月天| 丁香九九九九| 青青草伊人婷婷| 天天日天天干天天操| 狠狠色丁香久久久婷| 丁香六月天婷婷色| 伊人久久大香网| 六月色狠狠色| 色婷婷88| 婷婷六月天国产综合| 九九热10| 毛片网站谁有| 青青草五月天| 五月天久久久| 亭亭五月丁香五月天激情| 五月丁香综合啪啪| 婷婷五月天首页激情| 99色免费观看全部| 可以免费看AV网站| 久热视频A.| 丁香五月 无码| 色无码| 婷婷激情五月综合| 99热国内| 久热AA| 亚洲成人AV高清字幕| 久久99久久99精品免观看粉嫩| 热99久久这里只有精品| 99碰碰视频| 色色婷| 99综合99| www.射伊蕉婷婷| 屁股翘好撅高迎合跪趴| 亚洲激情在线| 激情综合五月婷婷| 欧美日本一区二区三区| 五月丁香激情片| 视频在线免费观看欧洲乱码| 国产熟妇乱子伦hd| 综合网天天| 亚洲综合五月天| 六月婷婷影院| 日韩欧美一区二区三区四区| 99人妻碰碰碰久久久久视| 9精品久久999| 99热综合| 色五月色五天色情网| 五月天综合图片| 丁香六月婷婷综合激情欧美| 久久99jiu9| 亚洲亚洲人成综合网络| 婷婷丁香五月天激情| 九九热最新| 这里只有精品免费视频在线观看 | 亚洲激情另类| 色婷婷五月天综合网| 婷婷成人网五月天| 色婷婷综合久久久久| 超碰在线94| 成人婷婷色综合| 中文字幕无码人妻少妇免费视频 | 亚洲AV网站| 天天天天天天操| 亚洲中文乱字字幕线在永久| 男人天堂亚洲综合| 天天操天天日天天爱| 国产三级片91| 亚洲传媒在线观看| 亚洲成人网站在线播放| 很很干天天干| 色五月婷婷久久| 色婷婷五月天在线| 九九热短视频在线观看| 久久丁香五月综合六月激情红杏视频| 内射综合网| 国产精品人妻在线网址| 亚洲免费av观看| 五月色情婷婷| 91亚洲视频| 国产九月婷婷| 大香蕉久久伊人网| 婷婷五月天成人视频| a性生活久久无| 伊人婷婷99热精品| 久热精品免费视频4| 综合网色| 九九av| 五月婷婷六月激情| 国产成人精品亚洲线观看| 97操碰| 日本人妻伦在线中文字幕| 人妻中文在线| 国产做A爰片毛片A片美国| 天天插天天干| 色九月婷婷| 女人高潮内射99精品| 欧美日韩欧美| 婷婷五月激情四射手| 色五月色综合| 丁香情色五月| 97操碰免费视频| 丁香六月欧美| 国产视频福利| 五月丁香综合啪啪| 丁香九月综合| 伊人国产婷婷五月天 | 精品亚洲国产成AV人片传媒| 超碰在线50| 疯狂做受XXXX高潮A片动画| 成人.在线日韩| 大香蕉视频99| 色五月激情综合| 色五月琪琪| 色五月天天在线观看资源站| 天堂久久精品| 色五月激情五月丁香五月婷婷啪啪综合| 天天综合五月| 亚洲热久久| 欧美色97| 亚洲va成人va成人va在线观看| 精品国产AV色一区二区深夜久久| 久久R激情| 久久99精品久久久久久青青AR| 久久免费丁香| 婷婷五月激情热播| www激情网| 久久丁香五月| 伊人五月天在线| 丰满少妇乱A片无码| 在线色婷婷| 久久性刺激| 综合五月丁香久久| 五月婷婷丁香狠狠撸久久| 丁香在线视频| 色爱亚洲| 成人精品免费在线观看| 97人人操| 五月永久激情| 99免费在线视频| 丁香五月偷拍| 一起草AV入口| 久久综合影院| 日日爱678| 国产精品视频久久99| 亚洲婷婷丁香| 久草热8精品视频在线观看| 色欲一区二区三区精品A片| 91超级碰人人操| 亚洲五月天,激情视频| 思思re视频在线| 五月天婷婷色色网| 成人无码精品1区2区3区免费看| 五月婷婷影视| 中文字幕人妻在线| 久久婷婷色丁香| 99狠狠| 超级碰碰97在线| 五月婷婷色白丝| 操b视频在线观看一区二区| 亚洲综合在线伊人婷| 亚洲激情五月丁香久久久久| 99色中文| 国产无套精品一区二区| 五月色婷婷夜色| 婷婷99视频精品| 亚洲综合在线丁香五月| 天天做天天爱| 丁香婷婷五月香蕉91| 婷婷色丁香五月| dingxiangtingtingliuyue| 五月天综合视频| 五月丁香婷婷色播无码| 久久黄色网扯| 91黄操| yirenjiqingshiping| 色婷婷婷av| 五月婷婷综合在线| 亚洲国产精品VA在线看黑人| 色5月婷婷色| 六月色日韩| 五月丁香六月婷婷激情网| 亚洲九N| 丁香玖玖视频大全| 狠狠色噜噜狠狠狠888了| 99热18| 色99婷婷五月天| 五月丁香六月合| 99久久激情视频| 久久亚洲天堂| 色操b| 成人精品视频99在线观看免费| 婷婷五月色综合| 婷婷干五月综合在线播放| 另类少妇人与禽zOZZ0性伦| 中美日韩成人在线| 可以看的av| 婷婷五月另类网站| 99精品在| 99精品成人无码A片观看金桔| 久久资源网五月婷| 丁香综合婷婷五月天| 亚洲182在线观看| 五月色综合| 99热热这里只精品996小说| 一级黄在线| 电影蜘蛛女| 思思热在线播放| 久久久ww| www.黄色片-久久成人国产精品在线播放-999AV| 色婷婷AV久久| 五月亭亭综合五码| 97伦乱| 五月丁香九九九综合| 性爱视频久久| 激情文学天天| 99久久网站| 国产激情综合| 成人在线视频网| 久久婷婷色综合| 狠狠干综合| 亚洲人人操| 色五月首页| 91九色白丝| 九九热视频首页/这里只有精品| www.婷婷五月| 9热在线视频精品| 狠色狠色狠色狠色狠色网| 亚洲色五月| 五月丁香六月情| 日本成人噜噜噜| 狠狠干思思热| 99热人人艹| 丁香婷婷老熟女综合网| 精品九九视频在线观看| 久久性爱视频| 五月婷婷色色色| 射区导航| 91精品综合久久久久久五月丁香| www.99色| 99视频精品| 婷婷丁香五月网| www.99免费视频| 五月天色区| 成人网站av免费网站推荐| 99九九视频| 中文字幕九九九九| 天天操婷婷| 亚洲九九免费| 日本色色影片| 狠狠色噜噜狠狠| 9超碰在线| 97碰人人操| 日本久久综合| 开心五月婷婷| sewuyuejiqingwang| 99在线视频观看| 直接看的AV网站| 婷婷国产欧美97| 99人碰碰碰| 五月丁香六月综合情在线观看| 我爱大香蕉| 婷婷开心综合人妻小说网址| 色色色com| 亚洲mm色| 国产JK精品白丝AV在线观看| 婷婷激情丁五月| 大地9中文在线观看免费高清| 亚洲AAA| 91人无码久久久久久| www.天天干| 97操操操| 久久久亚洲精品一区二区三区浴池| 99热只有这里才是精品| 色色丁香婷婷五月天| 丁香六月婷婷| 亚洲国产婷婷色五月| 熟妇内谢69XXXXXA片| 成人五月天视频播放| 久久久婷丁香五月天激情综合| 五月大香蕉| 五月天婷婷激情干干| 婷婷五月,综合伊人| 99热最新网址| 97极品在线| 精品人妻伦一二三区久| 综合五月激情| 五月激情网站| 91欧美| WWW,五月| 丁香婷婷色五月| 男人大jjc女人免费视频| 人妻少妇色综合| site:hcxsz888.com| 久操香蕉| 久久久人妻不卡| 五月丁香色婷婷熟女| 久久综合性| 好看的国产精品| 深爱五月中文字幕| 婷婷色网站| 欧洲激情五月天婷婷| 色亭亭九月| 婷婷色导航| WWW.99热| 天天五月丁香五月| 婷婷久久婷婷色五月| 成人看片网站| 99青青草| 天天干,天天舔| 国产毛多水多女人A片| AV性爱在线| WWW、日本色丁香co m| 97人人操人| 天天爽天天操| www.日本91| 亚洲丁香婷婷五月天综合色| 午夜丁香婷婷| 丁香五月天成人网站| 电影爱拉战争免费观看| 欧洲综合一区| 久热这里| 色色色综合网| 久久久久99精品成人片| 亚洲啪啪网| 五月天久久婷| 久久综合五月天| 九九热这里只有精品31| 国产1区2区3区在线观| 日韩xx在线| 婷婷五月影院| 大香蕉久久久久| 99er精品视频| 欧美色骚婷婷五月天| 狠狠干在线| 日韩成人中文| 人人爱操| 五月丁香色综合| www.狠狠干com| 丁香五月香蕉在线| 超碰免费大香蕉| 99久久国产宗和精品1上映| 99在线精品视频| 第四色首页| 69婷婷丁香午夜| 亚洲国产精品成人免费一区久久久在线观看AAAA| 五月婷婷黄色网址| 久久丁香| 超碰在线99| 五月丁香色婷婷色| 激情综合五月婷婷六月丁香 | 99热日韩| 色婷婷色五月丁香| 日韩色色色色色| 碰碰碰91| 5月丁香美女影院| 国产人妻777人伦精品HD | 婷婷亚洲综合| 欧美影院| 国产日韩欧美| 日韩操| 五月丁香趴趴| 婷婷六月成人| 婷婷丁香六月天| 久久99精品视频| 99ri精品视频在线观看| 激情视频综合| 九九精品视频在线观看| 综合激情五月丁香9999久久精| 97干网站| 九九大香视频| 98永久精品| 九九热91| 久久综合综合综合| 国产精产国品一二三在观看 | 99热这里只有精品3| 精品成人在线观看| 五月婷婷 激情五月| 激情综合五月色在线| 99免费成人网| 五月网激情| 女人露出p毛视频www网站| 爆乳熟女-区二区三区| 色婷婷五月天激情在线观看| 五月丁香婷婷伊人日韩| 五月婷婷开心亚州在线| 欧美黄色AA片哗啦啦啦| 日韩综合天堂| 五月婷婷激情综合| 天堂爱爱| 密着浓厚中出乚交尾GvG935| 天天天添天天操| 91中文狠狠综合| 狠狠久综合| 色婷婷六月天| 99 色色吧| 97人人操| 97超碰,人人舔,人人操,人人摸 | 97五月天婷婷综合激情网| 五月天com| 人人爽天天爽| 99自拍视频网站| 99性色| 丁香五月影院| 成人视频网| 色播五月婷婷| 人人妻人人澡| 99综合| 九九精品视频在线6| 亚洲精品久久久久久久久久吃药 | 婷婷亚洲五| 99精品超在线播放| 91在线日本| aaaaa黄色| 9热网站| 久九男女天堂| 久热伊人在91| 99操无码视频观看| 色播五月婷婷综合| 色婷婷影音| 热久久视频99| 五月天婷婷在线播放| 激情五月天久久丁香| 另类图片婷婷五月天| 婷婷色色网| 婷婷激情五月天桃花网| 丁香五月-激情综合| 丁香婷婷基地| 91男同视频| 国产高清视频91九九九久久久| enecarbon-materials.com污K127封锁请涟系@wip1688 | 久久色五月| 99熟女| 激情久久肏屄视频| 五月丁香婷婷无码中文| 六月婷婷激情小说网| 精品亚洲VA网站| 97碰| 成人精品视频99在线观看免费| 五月色情婷婷| 丁香五月首页| 丁香五月视频在线观看| 九九色综合视频| 亚洲av成人在线| 国产精品18久久久| 久久精品99国产精品日本| 91免费试看| 99视频色在线观看| 在线va网站| 一级操逼内射在线视频| 99视频久久| 99色爱| 97碰碰在线观看视频| 99亚洲综合| 五月欧美丁香在线观看| 天天综合精品| 97se在线视频| 噜噜噜噜噜在线| 六月伊人婷婷| 99亚洲精品| 免费无码毛片一区二区A片| 在线91日韩| 嫩草AV久久伊人妇女超级A| 99在线视频精品| 这里精品| 久久精彩免费视频| 丁香九色不卡aaa| 色欲人妻综合aaaaaaaa网| 天天干、天天日日| 狠狠香蕉| 五月婷婷久久爱| 色婷婷五月天中文字幕| 毛片色五月| 99在线免费观看| 天天网曰日曰夜夜综合永久免费| 国产1区2区3区在线观| 狠狠xx| 激情五月婷婷丁香| 99在线播放| 这里只有精品视频国产| 激情五月婷婷| 人人摸人人操人人爱| 99久在线精品| 色五月第四色| 国外亚洲成AV人片在线观看| 丁香婷婷色情| 综合图区激情| 激情五月天综合网| 久久精品五月| 颜射 精品性爱av| 伊人久久大香网| .精品久久久麻豆国产精品| 综激情网| 五月丁香六月婷婷在线| 中文字幕日产A片在线看| 超碰在线观看9| 婷婷射婷婷舔| 中字幕视频在线永久在线观看免费 | 玖色色综合| 天天操天天操| www.色五月| 97碰操| 欧洲亚洲欧洲99久久| 人妻操逼视频| 丁香婷婷超碰 | 无码髙清| 天堂五月婷婷| 欧美丁香婷婷五月| 9久热精品在线视频| 超碰日日操| 天天爽天天爽视频| 人与禽A片啪啪| 婷色人人狠| 91人操人人人操人| txt五月激情四射网综合俺也来了 五月天婷婷丁香人人操91 | 人人肏逼视频在线一区二区| 天天摸,天天爽| 日日.c| 久久 无毛。| 五月天综合影院| 激情玖玖sh| 五月天免费色| 亚洲aV写真天天综合网久久| 日韩一本操| 国产激情综合| 涩综合网| 五月丁香色婷基地综合久久| 五月天性色| 九九久久精品| 国产精品成人AV在线| 五月天激情啪啪| 久久婷婷五月综合色欧美| 婷婷色播综合五月| 婷婷久久精品| 亚洲免费av观看| 久久久久丁香婷婷五月天| 中文字幕按摩做爰| 色综久久AV| 亚洲无码播放| 九色91视频| 丁香婷婷六月天| 婷婷激情在线| 98色花堂98t.R| 久久在线大香蕉| 天天做天天爱天天玩| 国精产品一区一区三区免费视频| 五月天第四色开心色播| 激情影院丁香五月| 婷婷五月天堂网| 五月天婷婷丁香视频| 色伦专区97中文字幕| 狠狠色激情在线| 粉嫩AV久久一区二区三区| 综合97五月| 激情九月婷婷| 六月丁香基地| 亚洲视频一区| 99爱这里只有精品| 国产成人精品一区二三区熟女在线| yazhou seshipin| 中文毛片无遮挡高潮免费| 天天搽天天射| 国产在这里只有精品| 色五月综合| 中文字幕97超级碰| 中文字幕视频在线播放| 日本熟妇精品99| 激情综合色| 免费精品66| 日本婷久久| 99热都是精品| 99性爱视频| 伊人五月天久久| 99色在线观看视频| 成人AV免费观看| 超碰在线观看9| 亚洲欧美成人在线| 99综合网| 亚洲视频在线观看99| 色五月激情五月| 俺去啦综合网| 久久日韩婷婷五月| 亚洲中文av| 六月色日韩| 琪琪色综合网站| 色五月天成人| 好看的国产精品| 五月婷亚洲精品AV天堂| 3pAV| 色情终和网| 天天操婷婷| 色婷婷狠狠爱| 另类少妇人与禽zOZZ0性伦| 26UUU欧美激情一区二区| 亚洲国产精品VA在线看黑人| 丁香六月婷婷综合麻豆| 9l视频自拍九色9l黑人| 色情激情五月| 久热伊人在91| 人妻av在线| 成人噜噜网| 99在线精品视频| 97人人搞| 久久精品日| 99re免费精品视频| 欧美成人精品三区综合A片| 丁香六月毛片| 国产成人在线不卡AV| 开心五月婷婷| 五月婷婷五月天亚洲无码| 在线资源av-超碰中文在线-成人AV| 可以看的AV| 极品 少妇 内射| 日韩五月婷婷久久| 五月婷婷黄网站大全| www.seqingwuyuetian| 婷婷色在线观看| 五月丁香六月婷婷成人电影| www九月婷婷| 成人AV在线网站| 久色中文| 天天日夜夜欢| 六月婷婷色色网| 欧美性色视频| 99热久只有| 婷婷五月天丁香久久| 天干夜夜操| 夜夜操天天爽| 九九久久五月天综合伊人| 大战熟女丰满人妻AV| 久久精彩视频| www.五月激情.com| 狠干综合| 六月丁香五月婷婷| 狠狠搞狠狠操| 成人婷婷桔色| 色亭亭丁香五月天| 5月婷婷激情在线| 日本天天综合| AV在线大香蕉| 真实的国产乱XXXX在线91| 999婷婷综合| 婷婷六月丁香激情综合| 亚洲在线操| 九一娱乐在线观看视频| 欧美久热| 婷婷丁香五月欧美人| 亚洲天堂婷婷| 色婷婷偷拍| 99re在线这里只有精品视频首页| www超碰| 久久国产高清| 26uuu欧美| 久久3p| 天天色,天天日,天天做| 五月婷婷六月丁香激情深爱| 色婷婷AⅤ| 青青草伊人婷婷| 五月天婷婷基地| 五月婷婷色播| 热99精品视频| 日日干日日色| 黄网免费看| A片试看120分钟做受视频红杏| 狠狠草狠狠草| 五月天激情AAAA| 亚洲 综合中文| 久cao香蕉影院|