std::views::split în C++

Împarte un range (de obicei un text) în bucăți, după un separator: un caracter sau o secvență.

Sintaxă
auto v = range | std::views::split(separator);

Ce face std::views::split

std::views::split este răspunsul C++ la funcțiile explode/split din alte limbaje. Fiecare element rezultat este un subrange; pentru un text îl transformi în std::string_view (C++23) sau std::string.

Separatorul poate fi un caracter (',') sau o secvență, dată ca std::string_view (", "sv). Separatorii consecutivi produc bucăți goale. Rezultatul se poate salva cu std::ranges::to.

Parametri

Parametru Descriere
range Textul sau alt range.
separator Un element sau un range de elemente.

Ce returnează

Un view de subrange-uri.

Exemple

Exemplul 1: Împărțirea unei linii CSV

#include <print>
#include <ranges>
#include <string>
#include <string_view>

int main() {
    std::string linie = "Ana,Iași,25,programatoare";

    for (auto bucata : linie | std::views::split(',')) {
        std::println("[{}]", std::string_view(bucata));
    }
}

Rezultat

[Ana]
[Iași]
[25]
[programatoare]

Exemplul 2: Separator din mai multe caractere și salvare în vector

Fiecare bucată devine un std::string, iar ranges::to le adună într-un vector.

#include <print>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>

int main() {
    using namespace std::string_view_literals;
    std::string orase = "Iași, Cluj, Timișoara, Brașov";

    auto lista = orase
               | std::views::split(", "sv)
               | std::views::transform([](auto r) { return std::string(std::string_view(r)); })
               | std::ranges::to<std::vector>();

    std::println("{} orașe: {}", lista.size(), lista);
}

Rezultat

4 orașe: ["Iași", "Cluj", "Timișoara", "Brașov"]

Exemplul 3: Separatori consecutivi

#include <print>
#include <ranges>
#include <string_view>

int main() {
    std::string_view text = "a;;b;";
    for (auto bucata : text | std::views::split(';')) {
        std::print("[{}]", std::string_view(bucata));
    }
    std::println("");
}

Rezultat

[a][][b][]

Greșeli frecvente

  • Scrii split(", ") cu un șir C: separatorul include și caracterul de final '\0', deci nu găsește nimic. Folosește ", "sv sau std::string_view(", ").
  • Te aștepți ca bucățile goale să dispară. Elimină-le explicit cu std::views::filter.

Comenzi înrudite

  • std::views::join: Aplatizează un range de range-uri: parcurge pe rând elementele tuturor sub-range-urilor, ca o singură secvență.
  • std::ranges::to: Transformă un range sau un view (filtrat, transformat) într-un container nou: vector, set, string, map.
  • std::views::transform: Creează o vedere în care fiecare element este rezultatul unei funcții aplicate elementului original.