std::transform

Üdvözlöm, Ön a std::transform szó jelentését keresi. A DICTIOUS-ban nem csak a std::transform szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a std::transform szót egyes és többes számban mondani. Minden, amit a std::transform szóról tudni kell, itt található. A std::transform szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Astd::transform és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

std::transform (tsz. std::transforms)

  1. (informatika) A C++ nyelv Standard Template Library-jében (STL) számos hatékony algoritmust találunk, amelyek segítenek a gyakori műveletek elvégzésében. Ezek közé tartozik az std::transform is, amely egy nagyon rugalmas és gyakran használt algoritmus a <algorithm> fejlécben.

A std::transform fő célja az, hogy egy vagy két bemeneti tartomány elemein végighaladva transzformációt hajtson végre, és az eredményt egy kimeneti tartományba írja.

1. Mi is az std::transform?

Az std::transform egy általános célú algoritmus, amely az elemeket egy adott függvény vagy függvénytárgy (functor, lambda, stb.) segítségével átalakítja.

Egyszerűen fogalmazva:

👉 Vesz egy (vagy két) tartományt → végighalad az elemeken → alkalmaz egy függvényt → az eredményt kiírja a kimeneti tartományba.

2. Szintaxis

Egy tartomány esetén:

template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op);
  • first1, last1: a bemeneti tartomány kezdete és vége.
  • d_first: a kimeneti tartomány kezdete (hova írjuk az eredményt).
  • unary_op: egy egyváltozós függvény, amit az egyes bemeneti elemekre alkalmazunk.

Két tartomány esetén:

template<class InputIt1, class InputIt2, class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op);
  • first1, last1: az első bemeneti tartomány.
  • first2: a második bemeneti tartomány kezdete.
  • d_first: a kimeneti tartomány kezdete.
  • binary_op: kétszárnyú függvény (binary operation), ami az első és második tartományból vett párokat dolgozza fel.

3. Hogyan működik?

Az algoritmus az adott tartomány(ok) elemein iterátorokkal halad végig:

  • Egyszeres verzió: unary_op(*it) → eredmény → kiírjuk.
  • Páros verzió: binary_op(*it1, *it2) → eredmény → kiírjuk.

A std::transform nem módosítja a bemeneti tartományt! Csak a kimenetbe ír.

4. Példák

Példa 1: elemek négyzetre emelése

#include <iostream>
#include <vector>
#include <algorithm>  // transform
#include <iterator>   // back_inserter

int main() {
    std::vector<int> numbers{1, 2, 3, 4, 5};
    std::vector<int> squared;

    std::transform(numbers.begin(), numbers.end(), std::back_inserter(squared),
                   (int x) { return x * x; });

    for (int x : squared) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
}

Kimenet:

1 4 9 16 25

Magyarázat:

  • numbers vektor → bemenet.
  • Lambda: (int x) { return x * x; }
  • Eredmény → squared vektorba íródik.

Példa 2: sztring kisbetűsre alakítása

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string text = "HeLLo WoRLd!";
    std::string lower_text;

    lower_text.resize(text.size());

    std::transform(text.begin(), text.end(), lower_text.begin(),
                   (unsigned char c) { return std::tolower(c); });

    std::cout << lower_text << std::endl;
}

Kimenet:

hello world!

Magyarázat:

  • std::tolower segítségével minden karaktert kisbetűsítünk.
  • A std::transform karakterenként halad.

Példa 3: két tartomány összeadása

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> a{1, 2, 3, 4};
    std::vector<int> b{10, 20, 30, 40};
    std::vector<int> result;

    std::transform(a.begin(), a.end(), b.begin(), std::back_inserter(result),
                   (int x, int y) { return x + y; });

    for (int x : result) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
}

Kimenet:

11 22 33 44

Magyarázat:

  • Két vektor pár elemeit összeadjuk.
  • A binary_op egy kétszárnyú lambda.

5. Használati lehetőségek

Az std::transform nagyon rugalmas, tipikus használatai:

✅ elemek átalakítása (pl. szöveg feldolgozás) ✅ számítási műveletek (szorzás, összeadás, stb.) ✅ kombinációk két tartományból ✅ algoritmusokban adattisztítás ✅ adatformázás

6. Iterátorok és hatékony írás

A d_first iterátor lehet:

  • egy iterator egy már létező tartományba
  • vagy egy back_inserter → ilyenkor az eredmény automatikusan bővül

Példa back_inserter:

std::transform(vec.begin(), vec.end(), std::back_inserter(result), my_func);

Ha nem back_inserter, hanem sima iteratort adsz meg, a kimeneti tartománynak már helyet kell foglalnia (pl. resize-zel).

7. Előnyök

  • Egyszerű, deklaratív kódot írhatunk.
  • Hatékony: általában az STL algoritmusok optimalizáltak.
  • Olvashatóság: a transzformáció logikája jól látható.

8. Mikor ne használd?

  • Ha bonyolult mellékhatásokkal járna a lambda → jobb külön ciklus.
  • Ha iterációs állapot kell, pl. index, számláló → ilyenkor sima for jobb.

9. Összefoglalás

Az std::transform egy nagyon hatékony eszköz, ha elemeket kell transzformálni tartományok között.

Egyszeres verzió:

std::transform(first1, last1, d_first, unary_op);

Páros verzió:

std::transform(first1, last1, first2, d_first, binary_op);

Előnyei:

  • Rugalmas
  • Könnyen olvasható
  • STL standard algoritmus
  • Széles körben alkalmazható

Hátrányai:

  • Egyszerűbb ciklusoknál kissé “nehezebb” lehet olvasni kezdőként
  • Mellékhatásos kód esetén nem ajánlott



TL;DR

  • std::transform → elemek átalakítása egy vagy két tartományból egy másikba.
  • std::transform nem módosítja a bemenetet.
  • Ideális: adatformázás, feldolgozás, kombináció.
  • Részét képezi a <algorithm> fejlécnek.