Можно ли использовать `split_view` или композицию нескольких `spilt_view` для разделения `string`/`string_view` с использованием нескольких разделителей?

Я пытаюсь понять, как могут быть составлены представления, и их ограничения. Идея здесь состоит в том, чтобы разделить string/string_view без создания временной переменной, как показано во втором блоке кода.

Почему не компилируется следующее:

std::string line = "1[2]3";
for (const auto split : line 
                        | std::ranges::views::split('[') 
                        | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); }) 
                        | std::ranges::views::split(']') 
                        | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); })) {
    std::cout << split << '\n';
}

Дополнительный вопрос: почему приведенный выше код не компилируется, но работает следующее:

for (const auto split_once : line 
                             | std::ranges::views::split('[')
                             | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); })) {
    for (const auto split_twice : split_once 
                                     | std::ranges::views::split(']') 
                                     | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); })) {
            std::cout << split_twice << '\n';
   }
}

Ссылка на проводник компилятора

В первом, похоже, нет ни сбалансированных { и }, ни сбалансированных ( и ). Включите сообщение об ошибке в вопрос.

Ted Lyngmo 23.06.2024 21:09

@TedLyngmo спасибо, что указали на опечатку. Сообщение об ошибке довольно длинное; на случай, если вы пропустили это, есть ссылка на проводник компилятора, где видна ошибка.

vss2sn 23.06.2024 22:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первый views::transform создает диапазон, элементы которого имеют тип string_view, который невозможно просто разделить символом ']'.

Вместо этого вы можете, например, продолжать разделять каждую string_view и объединять их вместе.

std::string line = "1[2]3";
for (const auto split : line 
                        | std::ranges::views::split('[')
                        | std::ranges::views::transform(
                            std::ranges::views::split(']') |
                            std::ranges::views::transform(
                              [](auto rng) {return std::string_view(rng); })
                          )
                        | std::views::join) {
    std::cout << split << '\n';
}

Демо

std::views — это сокращение от std::ranges::views. Вы можете пойти еще дальше и внедрить пространство имен в используемую область (непосредственно перед циклом for):{using namespace std::views; for/*...*/};. Фигурные скобки ограничивают видимость пространства имен и минимизируют вероятность конфликта имен, одновременно приводя к более сжатому коду.
Red.Wave 24.06.2024 10:57

Спасибо за ваш ответ! Не могли бы вы расширить ответ, чтобы объяснить, почему второй блок кода в вопросе работает, когда выходные данные transform передаются по конвейеру в split, но сначала сохраняются как именованная переменная? Кроме того, что касается вашего ответа, почему вторая split работает, когда вызывается внутри transform, но не снаружи (т. е. как функция transform изменяет/влияет на входные данные, чтобы вторая split работала правильно)?

vss2sn 24.06.2024 17:20

@vss2sn Потому что тип split_once — это string_view, который можно разделить одним символом ']'.

康桓瑋 24.06.2024 19:18

Другие вопросы по теме