作为TotW#10最初发表于2012年8月16日
更新于2018-01-24
我的脑子里常有一个奇怪的分歧。——约翰·克莱斯
在任何通用编程语言中,将字符串拆分为子字符串都是常见的任务,C ++也不例外。当需要在Google出现时,许多工程师发现,在有组织地增长的头文件中,他们自己陷入了分割函数的泥潭中。你会寻找满足你需求的的输入参数、输出参数和语义的神奇组合。在研究了600多行的头文件中的50多个函数之后,你可能最终决定为某些事命名一个SplitStringViewToDequeOfStringAllowEmpty()般曲折的名字。
为了解决这个问题,C++库团队实现了一个的分割字符串新API,可用在absl / strings / str_split.h。
新的API用单个absl :: StrSplit()函数替换了许多分割函数。此函数将需要分割的输入字符串和要用来分割字符串的分隔符作为参数。absl::StrSplit()使返回的集合适应调用者指定的类型。absl::StrSplit()的实现是非常有效的,因为内部使用了absl::string_views;除非调用者明确要求将结果存放在字符串对象的集合中(会拷贝其数据),否则不会进行任何拷贝。
闲话少说,让我们看一些例子:
// 用逗号分割.存储在string_view的vector中(没有拷贝)
std::vector<absl::string_view> v = absl::StrSplit("a,b,c", ',');
// 用逗号分割.存储在string的vector中(数据拷贝一次)
std::vector<std::string> v = absl::StrSplit("a,b,c", ',');
// 用字面字符串"=>"(不是"="也不是">")分割
std::vector<absl::string_view> v = absl::StrSplit("a=>b=>c", "=>");
// 用任何一个给定的字符(',' 或 ';')分割
using absl::ByAnyChar;
std::vector<std::string> v = absl::StrSplit("a,b;c", ByAnyChar(",;"));
// 存储在不同的容器中(也可以使用absl::string_view)
std::set<std::string> s = absl::StrSplit("a,b,c", ',');
std::multiset<std::string> s = absl::StrSplit("a,b,c", ',');
std::list<std::string> li = absl::StrSplit("a,b,c", ',');
// 等价于虚构的SplitStringViewToDequeOfStringAllowEmpty()
std::deque<std::string> d = absl::StrSplit("a,b,c", ',');
// 产生"a"->"1", "b"->"2", "c"->"3"
std::map<std::string, std::string> m = absl::StrSplit("a,1,b,2,c,3", ',');
更多信息,请查阅absl/strings/str_split.h以获取更多关于如何使用API的详情,以及absl/strings/str_split_test.cc以获取更多的示例。
感谢你的阅读。现在我要开始真正的分割…