std::adjacent_difference în C++

Calculează diferențele dintre fiecare element și cel dinaintea lui; primul element este copiat neschimbat.

Sintaxă
OutputIt adjacent_difference(InputIt first, InputIt last, OutputIt d_first);

Ce face std::adjacent_difference

std::adjacent_difference scrie la destinație a0, a1 - a0, a2 - a1 etc. Este operația inversă lui std::partial_sum: aplicând sumele parțiale pe rezultat, obții înapoi datele inițiale.

Cu un al patrulea argument folosești altă operație între vecini (de exemplu raportul, pentru creștere procentuală).

Parametri

Parametru Descriere
first, last Intervalul sursă.
d_first Destinația.
op Opțional. Funcție (curent, anterior).

Ce returnează

Iterator după ultimul element scris.

Exemple

Exemplul 1: Cât s-a parcurs în fiecare zi

Contorul de kilometri crește cumulat; diferențele arată distanța zilnică.

#include <numeric>
#include <print>
#include <vector>

int main() {
    std::vector<int> kilometraj{10200, 10350, 10410, 10690, 10700};
    std::vector<int> zilnic(kilometraj.size());

    std::adjacent_difference(kilometraj.begin(), kilometraj.end(), zilnic.begin());

    for (std::size_t i = 1; i < zilnic.size(); ++i) {
        std::println("Ziua {}: {} km", i, zilnic[i]);
    }
}

Rezultat

Ziua 1: 150 km
Ziua 2: 60 km
Ziua 3: 280 km
Ziua 4: 10 km

Exemplul 2: Inversul lui partial_sum

#include <numeric>
#include <print>
#include <vector>

int main() {
    std::vector<int> v{2, 5, 9, 14};
    std::vector<int> dif(v.size());
    std::vector<int> inapoi(v.size());

    std::adjacent_difference(v.begin(), v.end(), dif.begin());
    std::partial_sum(dif.begin(), dif.end(), inapoi.begin());

    std::println("Diferențe: {}", dif);
    std::println("Înapoi:    {}", inapoi);
}

Rezultat

Diferențe: [2, 3, 4, 5]
Înapoi:    [2, 5, 9, 14]

Greșeli frecvente

  • Uiți că primul element al rezultatului este valoarea inițială, nu o diferență, și îl incluzi în calcule (de exemplu în media diferențelor).

Comenzi înrudite

  • std::partial_sum: Calculează sumele parțiale (cumulate): fiecare element al rezultatului este suma tuturor elementelor până la el.
  • std::adjacent_find: Găsește prima pereche de elemente vecine egale (sau care îndeplinesc o condiție între ele).
  • std::transform: Aplică o funcție fiecărui element și scrie rezultatele în alt interval (sau în același).