std::views::join în C++

Aplatizează un range de range-uri: parcurge pe rând elementele tuturor sub-range-urilor, ca o singură secvență.

Sintaxă
auto v = range_de_range | std::views::join;

Ce face std::views::join

std::views::join transformă, de exemplu, un vector<vector<int>> într-o secvență plată de int, fără copiere. Pe un vector<string> dă toate caracterele, unul după altul.

Pentru a pune un separator între bucăți există std::views::join_with (C++23), care este opusul lui split.

Parametri

Parametru Descriere
range_de_range Un range ale cărui elemente sunt la rândul lor range-uri.

Ce returnează

Un view plat.

Exemple

Exemplul 1: Toate notele din toate grupele

#include <algorithm>
#include <print>
#include <ranges>
#include <vector>

int main() {
    std::vector<std::vector<int>> grupe{{9, 7}, {10, 6, 8}, {5}};

    auto toate = grupe | std::views::join;
    std::println("{}", toate);
    std::println("Note de cel puțin 8: {}", std::ranges::count_if(toate, [](int n) { return n >= 8; }));
}

Rezultat

[9, 7, 10, 6, 8, 5]
Note de cel puțin 8: 3

Exemplul 2: Lipirea cuvintelor (join și join_with)

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

int main() {
    std::vector<std::string> cuvinte{"Ana", "are", "mere"};

    auto lipit = cuvinte | std::views::join | std::ranges::to<std::string>();
    auto cu_spatii = cuvinte | std::views::join_with(' ') | std::ranges::to<std::string>();

    std::println("{}", lipit);
    std::println("{}", cu_spatii);
}

Rezultat

Anaaremere
Ana are mere

Greșeli frecvente

  • Aplici join pe un view care produce containere temporare (de exemplu un transform care returnează std::string) cu un compilator vechi: unele implementări C++20 nu acceptau asta. În C++23 funcționează.

Comenzi înrudite

  • std::views::split: Împarte un range (de obicei un text) în bucăți, după un separator: un caracter sau o 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.