使用 std::accumulate 简化 appender 函数
Simplification of appender function using std::accumulate
我想要一个简单的函数,它接受一组字符串并附加它们,returns 一个字符串是每个字符串项附加在一起。我认为 std::accumulate 是可行的方法,但有兴趣了解是否可以改进此代码。
是否有更简单的附加类型函数可以在这里使用而不是 lambda?
这是否过于复杂并且最好通过其他代码实现?
#include <string>
#include <vector>
#include <iostream>
#include <numeric>
std::string concatenate(std::vector<std::string> strings)
{
return std::accumulate(strings.begin(), strings.end(), std::string(""), [](std::string s1, std::string s2) { return s1 + s2; });
}
int main() {
std::vector<std::string> vec2{ "aaa","bbb","ccc","ddd","eee","fff" };
std::cout << concatenate(vec2) << std::endl;
}
是的,您可以完全省略 lambda(或使用 std::plus<>{}
)。
也可以从 std::string("")
中删除 ""
,或者如果您切换到 std::reduce
:
,则可以删除整个第三个参数
std::reduce(strings.begin(), strings.end());
另外 concatenate
应该通过 const 引用获取向量,或者更好的是 std::span<const std::string>
(按值)。
libfmt 也可用于此:
fmt::format("{}", fmt::join(strings, ""));
可以用C++17 fold expression简化,不需要中间或临时集合。
#include <string>
#include <iostream>
template<typename ...S>
std::string concatenate(S&&... strings) {
using namespace std::string_literals;
return (""s + ... + strings);
}
int main() {
std::cout << concatenate("aaa","bbb","ccc","ddd","eee","fff") << std::endl;
}
我想要一个简单的函数,它接受一组字符串并附加它们,returns 一个字符串是每个字符串项附加在一起。我认为 std::accumulate 是可行的方法,但有兴趣了解是否可以改进此代码。
是否有更简单的附加类型函数可以在这里使用而不是 lambda?
这是否过于复杂并且最好通过其他代码实现?
#include <string>
#include <vector>
#include <iostream>
#include <numeric>
std::string concatenate(std::vector<std::string> strings)
{
return std::accumulate(strings.begin(), strings.end(), std::string(""), [](std::string s1, std::string s2) { return s1 + s2; });
}
int main() {
std::vector<std::string> vec2{ "aaa","bbb","ccc","ddd","eee","fff" };
std::cout << concatenate(vec2) << std::endl;
}
是的,您可以完全省略 lambda(或使用 std::plus<>{}
)。
也可以从 std::string("")
中删除 ""
,或者如果您切换到 std::reduce
:
std::reduce(strings.begin(), strings.end());
另外 concatenate
应该通过 const 引用获取向量,或者更好的是 std::span<const std::string>
(按值)。
libfmt 也可用于此:
fmt::format("{}", fmt::join(strings, ""));
可以用C++17 fold expression简化,不需要中间或临时集合。
#include <string>
#include <iostream>
template<typename ...S>
std::string concatenate(S&&... strings) {
using namespace std::string_literals;
return (""s + ... + strings);
}
int main() {
std::cout << concatenate("aaa","bbb","ccc","ddd","eee","fff") << std::endl;
}