Abseil之拆分字串

2021-09-24 16:31:47 字數 1586 閱讀 1230

在任何通用程式語言中,將字串分割成子串是乙個常見的任務,c++也不例外。當谷歌出現需求時,許多任務程師發現自己正艱難地通過乙個不斷增長的標頭檔案分割函式的泥潭。您可能已經找到了滿足您需求的輸入引數、輸出引數和語義的神奇組合。在研究了600+行頭檔案中的50+個函式之後,您可能最終決定了乙個類似splitstrin**iewtodequeofstringallowempty()的複雜名稱。

為了解決這個問題,c++庫團隊實現了乙個新的api,用於拆分字串,可以在absl/strings/str_split.h中使用。

新的api用乙個absl::strsplit()函式替換了許多拆分函式。此函式接受要拆分的輸入字串和作為引數拆分字串的分隔符。absl::strsplit()將返回的集合調整為呼叫方指定的型別。absl::strsplit()的實現是有效的,因為absl::string_view在內部使用;除非呼叫者明確請求將結果儲存在字串物件集合中(該集合複製其資料),否則不會進行任何複製。

說得夠多,讓我們看一些例子

// splits on commas. stores in vector of string_view (no copies).

std::vectorv = absl::strsplit("a,b,c", ',');

// splits on commas. stores in vector of string (data copied once).

std::vectorv = absl::strsplit("a,b,c", ',');

// splits on literal string "=>" (not either of "=" or ">")

std::vectorv = absl::strsplit("a=>b=>c", "=>");

// splits on any of the given characters (',' or ';')

using absl::byanychar;

std::vectorv = absl::strsplit("a,b;c", byanychar(",;"));

// stores in various containers (also works w/ absl::string_view)

std::sets = absl::strsplit("a,b,c", ',');

std::multisets = absl::strsplit("a,b,c", ',');

std::listli = absl::strsplit("a,b,c", ',');

// equiv. to the mythical splitstrin**iewtodequeofstringallowempty()

std::dequed = absl::strsplit("a,b,c", ',');

// yields "a"->"1", "b"->"2", "c"->"3"

std::mapm = absl::strsplit("a,1,b,2,c,3", ',');

謝謝你的閱讀。現在我真的要分開了…

Abseil之字串連線

當 reviower人說 不要使用字串連線操作符,它不是那麼高效 時,使用者常常感到驚訝。std string operator 不高效?搞錯了吧?事實證明,這樣的低效率並不是顯而易見的。實際上,這兩個 段的執行時間幾乎相同 std string foo longstring1 std string...

oracle之字串拆分

create table zylemp ename varchar2 50 insert into zylemp values 中國 insert into zylemp values 中國 湖北 insert into zylemp values 中國 湖北 黃岡 insert into zyle...

拆分字串

拆分乙個字串,獲取每一組的key與value。如字串 qq adf f qewr98 eer d9adf t ad34 f qewrqr u adf43 gggg 2344 按照物件導向理念來解決,建立乙個物件 這個是對物件物件,有key和value兩個特性。我們需要把拆分好的資料臨時儲存起來,現在...