Как разбить std::string на диапазон (v3) std::string_views?

Мне нужно разделить std::string на всех пространствах. Полученный диапазон, однако, должен преобразовать его элемент в std::string_views. Я борюсь с "типом элемента" диапазона. Я думаю, что-то типа c_str, Как я могу преобразовать "разделенную" часть в string_views?

#include <string>
#include <string_view>
#include "range/v3/all.hpp"

int main()
{
    std::string s = "this should be split into string_views";

    auto view = s 
            | ranges::view::split(' ') 
            | ranges::view::transform(std::string_view);
}

1 ответ

Решение

(Одна из) проблема здесь в том, что ranges::view::split возвращает диапазон диапазонов, и вы не можете построить std::string_view прямо из диапазона.

Вы хотите что-то вроде этого:

auto view = s
    | ranges::view::split(' ')
    | ranges::view::transform([](auto &&rng) {
            return std::string_view(&*rng.begin(), ranges::distance(rng));
});

Там может быть лучший / более простой способ сделать это, но:

  • &*rng.begin() даст вам адрес первого символа чанка в исходной строке.
  • ranges::distance(rng) даст вам количество символов в этом чанке. Обратите внимание, что это медленнее, чем ranges::size но требуется здесь, потому что мы не можем получить размер rng в постоянное время.
Другие вопросы по тегам