Tip of the Week #10: Splitting Strings, not Hairs
Originally published as totw/10 on 2012-08-16 By Greg Miller (jgmgoogle.com) Updated 2018-01-24 I tend to have an odd split in my mind. –John Cleese
在任何通用目的的编程语言中将一个string切割成一个子串是一个很常见的任务C也不例外。当谷歌出现这种需求时许多工程师发现自己需要通过扩展头文件的方式来扩展分割字符串的功能。你需要寻找满足您需求的输入参数、输出参数和语义的神奇组合。在研究了600多行标题中的50多个函数以后你可能错误的将新的分割函数命名为SplitStringViewToDequeOfStringAllowEmpty()。
为了处理这个问题C库的团队实现了一个新的API用于实现字符串分割的功能其头文件在absl/strings/str_split.h。
这个新的API将许多功能类似的分割函数替换成了一个单个的 absl::StrSplit()函数。这个函数接收一个将被分割的string和一个分隔符作为输入absl::StrSplit()返回结果将会适配调用者指定的类型。absl::StrSplit的实现是高效的因为其内部广泛使用了absl::string_view。除非调用者明确将结果存储在字符串对象的集合中(会复制其数据)否则不会复制数据的。
说够了让我们看一些例子
// Splits on commas. Stores in vector of string_view (no copies).std::vector v absl::StrSplit("a,b,c", ,);// Splits on commas. Stores in vector of string (data copied once).std::vector v absl::StrSplit("a,b,c", ,);// Splits on literal string ">" (not either of "" or ">")std::vector v absl::StrSplit("a>b>c", ">");// Splits on any of the given characters (, or ;)using absl::ByAnyChar;std::vector v absl::StrSplit("a,b;c", ByAnyChar(",;"));// Stores in various containers (also works w/ absl::string_view)std::set s absl::StrSplit("a,b,c", ,);std::multiset s absl::StrSplit("a,b,c", ,);std::list li absl::StrSplit("a,b,c", ,);// Equiv. to the mythical SplitStringViewToDequeOfStringAllowEmpty()std::deque d absl::StrSplit("a,b,c", ,);// Yields "a"->"1", "b"->"2", "c"->"3"std::map m absl::StrSplit("a,1,b,2,c,3", ,);
更多的细节相关的信息可以去看absl/strings/str_split.h对于如何使用Split的API可以看absl/strings/str_split_test.cc里面有很多examples。
【感谢龙石为本站提供api管理平台 http://www.longshidata.com/pages/apigateway.html】