Хотелось бы иметь функцию, являющуюся аналогом функции String.join из Java, но в виде отдельной функции.

gavvs1977
gavvs1977

Иногда бывает необходимо следующее: в некотором контейнере, поддерживающем двунаправленные итераторы, содержатся строки типа std::basic_string, и хотелось бы склеить все эти строки в одну, но разделив склеиваемые строки заданным разделителем.

Ниже приведена возможная реализация:

template<typename BidirectionalIt,
         typename CharT,
         typename Traits    = std::char_traits<CharT>,
         typename Allocator = std::allocator<CharT>>
std::basic_string<CharT, Traits, Allocator> join(BidirectionalIt first,
                                                 BidirectionalIt last,
                                                 const std::basic_string<CharT, Traits, Allocator>& separator)
{
    using str_type = std::basic_string<CharT, Traits, Allocator>;
    str_type result;
    if(first == last){
        return result;
    }
    auto pre_last = --last;
    if(first == pre_last){
        return *first;
    }
    for(auto it = first; it != pre_last; ++it){
        result += *it + separator;
    }
    result += *pre_last;
    return result;
}
5
рейтинг
3 комментария
Andrey Davydov
http://en.cppreference.com/w/cpp/experimental/ostream_joiner
Andrey Davydov
Antervis
Еще есть ranges-v3::view::join
Antervis
d-yaroshev
Надо сказать, что написание этой функции - это целая история.

Например, упражнения в abseil: https://github.com/abseil/abseil-cpp/blob/master/absl/strings/internal/str_join_internal.h#L226
d-yaroshev
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения