potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20 文字列を結合する関数

#include <array>
#include <string>
#include <vector>

template <std::ranges::range T>
requires std::negation_v<std::ranges::sized_range<T>>&& std::same_as<std::ranges::range_value_t<T>, std::wstring>
std::wstring join(const T& range, std::wstring_view sep)
{
    size_t buffer_size{ 0 };
    size_t count{ 0 };
    for (const auto& s : range)
    {
        buffer_size += s.size();
        ++count;
    }
    buffer_size += sep.size() * (count - 1);

    std::wstring buffer;
    buffer.reserve(buffer_size);
    size_t i{ 0 };
    for (const auto& s : range)
    {
        buffer.append(s);
        if (++i != count)
            buffer.append(sep);
    }
    return std::move(buffer);
}

template <std::ranges::range T>
requires std::ranges::sized_range<T>&& std::same_as<std::ranges::range_value_t<T>, std::wstring>
std::wstring join(const T& range, std::wstring_view sep)
{
    size_t buffer_size{ 0 };
    size_t count{ std::ranges::size(range) };
    for (const auto& s : range)
        buffer_size += s.size();
    buffer_size += sep.size() * (count - 1);

    std::wstring buffer;
    buffer.reserve(buffer_size);
    size_t i{ 0 };
    for (const auto& s : range)
    {
        buffer.append(s);
        if (++i != count)
            buffer.append(sep);
    }
    return std::move(buffer);
}