每周技巧 #36:新的 Join API

本节阅读量:

本文翻译自 Abseil 官网的 Tip of the Week #36: New Join API

原文最初作为 totw/36 发布于 2013 年 3 月 21 日。

作者:Greg Miller

更新于 2018 年 1 月 24 日。

“我很想加入一个俱乐部,然后用它敲你的头。”– Groucho Marx

你们很多人都希望有一个新的 join API,我们听到了。现在我们有了一个可以替代所有旧函数的 join 函数,它叫 absl::StrJoin()。你只需要给它一个要连接的对象集合和一个分隔符字符串,剩下的交给它即可。它可以处理 std::stringabsl::string_viewintdouble 等集合,也就是任何 absl::StrCat() 支持的类型。如果你需要连接一种不能直接 StrCat() 的类型,也可以为该类型提供自定义 Formatter;下面我们会看到,使用 Formatter 可以很漂亮地连接一个 map。

先看几个快速示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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。这会让输出清晰且易读。

1
2
3
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 传入。

1
2
3
4
5
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

每周技巧 #24:拷贝,简写版

上一节

每周技巧 #42:优先使用工厂函数,而不是初始化方法

下一节


本节目录