使用 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;
}