Как разбить std::string на диапазон (v3) std::string_views?
Мне нужно разделить std::string
на всех пространствах. Полученный диапазон, однако, должен преобразовать его элемент в std::string_view
s. Я борюсь с "типом элемента" диапазона. Я думаю, что-то типа c_str
, Как я могу преобразовать "разделенную" часть в string_view
s?
#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
в постоянное время.