(原文链接:https://abseil.io/tips/36 译者:clangpp@gmail.com)
每周贴士 #36: 新的拼接API
- 最初发布于2013-03-21
- 作者:Greg Miller (jgm@google.com)
- 更新于2018-01-24
“I got a good mind to join a club and beat you over the head with it.” – Groucho Marx
(译者注:译者文学水平太洼,起兴这部分保留原文。欢迎在评论区给出翻译建议。)
很多人想要一个新的拼接API。我们现在有一个新的拼接函数来替换所有现有的API,它的名字是absl::StrJoin()
。你只需要给它一个需要被拼接的对象集合和一个分隔字符串,它会搞定剩下的事儿。它支持 std::string
、absl::string_view
、int
、double
——任何absl::StrCat()
支持的类型——构成的集合。如果你需要拼接StrCat()
不支持的类型,你可以为该类型提供一个自定义的Formatter
;后面我们会看到怎么用Formatter
拼接一个map
。
先来看几个小例子:
std::vector<std::string> v = {"a", "b", "c"};
std::string s = absl::StrJoin(v, "-");
// s == "a-b-c"
std::vector<absl::string_view> v = {"a", "b", "c"};
std::string s = absl::StrJoin(v.begin(), v.end(), "-");
// s == "a-b-c"
std::vector<int> v = {1, 2, 3};
std::string s = absl::StrJoin(v, "-");
// s == "1-2-3"
const int a[] = {1, 2, 3};
std::string s = absl::StrJoin(a, "-");
// s == "1-2-3"
下面的例子用一个Formatter
参数来格式化map
里的pair
,并且换了一个分隔字符串,使输出既美观又易读。
std::map<std::string, int> m = {{"a", 1}, {"b", 2}, {"c", 3}};
std::string s = absl::StrJoin(m, ";", absl::PairFormatter("="));
// s == "a=1;b=2;c=3"
你还可以传一个C++ lambda表达式作为Formatter
。
std::vector<Foo> foos = GetFoos();
std::string s = absl::StrJoin(foos, ", ", [](std::string* out, const Foo& foo) {
absl::StrAppend(out, foo.ToString());
});
请参阅absl/strings/str_join.h获取更多信息。