在任何通用编程语言中,将字符串分割成子串是一个常见的任务,C++也不例外。当谷歌出现需求时,许多工程师发现自己正艰难地通过一个不断增长的头文件分割函数的泥潭。您可能已经找到了满足您需求的输入参数、输出参数和语义的神奇组合。在研究了600+行头文件中的50+个函数之后,您可能最终决定了一个类似SplitStringViewToDequeOfStringAllowEmpty()
的复杂名称。
为了解决这个问题,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::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的详细信息,了解更多示例。
谢谢你的阅读。现在我真的要分开了…