你们中的许多人要求新的加入API,我们听到了。我们现在有一个连接函数来替换它们,它的拼写是absl::StrJoin()
。只需给它一个要联接的对象集合和一个分隔符字符串,其余的就可以了。它将与std::string
,absl::string_view
,int
,double
-任何类型的absl::StrCat()
支持。如果您需要加入一个不会strcat()的类型,您还可以为该类型提供一个自定义格式化程序;下面我们将看到如何使用格式化程序让我们很好地加入一个映射。
现在,举几个简单的例子:
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"
下面的示例使用不同的分隔符传递格式化程序参数以格式化映射中的对。这使得输出变得美观和可读。
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表达式作为格式化程序传递。
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