std::views::keys în C++

Din perechi (de exemplu dintr-un std::map), păstrează doar cheile (keys) sau doar valorile (values).

Sintaxă
auto k = range_de_perechi | std::views::keys;
auto v = range_de_perechi | std::views::values;

Ce face std::views::keys

std::views::keys ia primul element din fiecare pereche sau tuplu, iar std::views::values pe al doilea. Cel mai des se folosesc pe std::map și std::unordered_map.

Sunt scurtături pentru std::views::elements<0> și std::views::elements<1>. Prin values poți și modifica valorile din map.

Parametri

Parametru Descriere
range_de_perechi Un range de std::pair sau std::tuple.

Ce returnează

Un view cu cheile, respectiv cu valorile.

Exemple

Exemplul 1: Chei și valori dintr-un map

#include <map>
#include <print>
#include <ranges>
#include <string>

int main() {
    std::map<std::string, int> stoc{{"mere", 40}, {"pere", 15}, {"prune", 0}};

    std::println("Produse: {}", stoc | std::views::keys);
    std::println("Cantități: {}", stoc | std::views::values);
}

Rezultat

Produse: ["mere", "pere", "prune"]
Cantități: [40, 15, 0]

Exemplul 2: Modificarea valorilor și suma lor

#include <algorithm>
#include <functional>
#include <map>
#include <print>
#include <ranges>
#include <string>

int main() {
    std::map<std::string, double> preturi{{"cafea", 12.5}, {"ceai", 8.0}, {"suc", 9.5}};

    for (double& p : preturi | std::views::values) {
        p *= 1.1;
    }

    double total = std::ranges::fold_left(preturi | std::views::values, 0.0, std::plus<>());
    std::println("Total: {:.2f} lei", total);
}

Rezultat

Total: 33.00 lei

Greșeli frecvente

  • Încerci să modifici cheile prin views::keys pe un std::map: cheile sunt const și nu compilează.

Comenzi înrudite

  • std::views::transform: Creează o vedere în care fiecare element este rezultatul unei funcții aplicate elementului original.
  • std::views::zip: Parcurge mai multe range-uri în paralel, oferind la fiecare pas un tuplu cu elementele de pe aceeași poziție.
  • std::ranges::to: Transformă un range sau un view (filtrat, transformat) într-un container nou: vector, set, string, map.