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", "svsaustd::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.