Tip of the Week #36: New Join API
Posted zhangyifei216
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tip of the Week #36: New Join API相关的知识,希望对你有一定的参考价值。
Tip of the Week #36: New Join API
Originally published as totw/36 on 2013-03-21
By Greg Miller (jgm@google.com)
Updated 2018-01-24
“I got a good mind to join a club and beat you over the head with it.” – Groucho Marx
你们许多人要求提供新的Join API
,并且我们也听到你的声音。我们现在有一个Join
的函数来替换他们所有。它拼写为absl::StrJoin
,你只需要给它一个要加入的对象和一个分隔符串的集合,剩下的就完成了。它将与std::string
、absl::string_view
、int
、double
的集合一起工作。任何absl::StrCat
所支持的类型absl::StrJoin
都支持,对于不支持的类型可以通过提供一个定制的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类型,这使得输出结果更好并且可读。
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来获取更多细节。
以上是关于Tip of the Week #36: New Join API的主要内容,如果未能解决你的问题,请参考以下文章
Tip of the Week #59: Joining Tuples
Tip of the Week #11: Return Policy
Tip of the Week #64: Raw String Literals
Tip of the Week #64: Raw String Literals