本周小贴士#10:分割字符串,不需要吹毛求疵

本文介绍了C++中用于字符串分割的新API——absl::StrSplit(),它通过单一函数替代了多种分割方法,提高了效率并减少了拷贝。示例展示了如何根据需求将字符串按不同分隔符存储到不同类型的容器中,如vector、set、multiset和deque。absl::StrSplit()允许灵活指定分隔符,并提供了高效的string_view实现。
摘要由CSDN通过智能技术生成

作为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以获取更多的示例。

感谢你的阅读。现在我要开始真正的分割…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值