2013-06-07 9 views
7

Zastanawiam się, czy nie było nic (albo w C++ 11 lub doładowania), który mógłby pomóc mi zrobić coś takiego:algorytm, aby dodać wartości z dwóch zakresów i umieścić je w trzeci

std::vector<int> v1 = {1, 2, 3}; 
std::vector<int> v2 = {2, 5, 4}; 
std::list<int> res; 
algorithm(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(res), std::plus<int>()); 

wynik powinien oczywiście wynosić {3, 7, 7} i gdzie zamiast std :: plus może być dowolna funkcja binary.

Więc jeśli ktoś ma pomysł, daj mi znać.

+0

[std :: transform] (http://en.cppreference.com/w/cpp/algorithm/transform) –

Odpowiedz

9

Do tego celu można użyć przeciążenia z 5 parametrami: std::transform. Dzieje binarny funktor do pracy w parach elementów dwóch zakresach:

std::transform(v1.begin(), 
       v1.end(), 
       v2.begin(), 
       back_inserter(res), 
       std::plus<int>()); 
+0

oh ok Nie wiedziałem, że istnieje wersja z pięcioma parametrami. Powinienem wyglądać lepiej, dzięki wszystkim. –

+0

+1 za przeciwstawienie się pokusie użycia lambda, gdy jest już dla niej std funktor. –

12

Tak dla zabawy, będę wskazywać alternatywy dla std::vector i std::transform. Zamiast tego możesz użyć std::valarray.

#include <valarray> 
#include <iostream> 

int main() { 
    std::valarray<int> a = {1, 2, 3}; 
    std::valarray<int> b = {2, 5, 4}; 

    std::valarray<int> c = a + b; // look ma, no transform! 

    for (int i=0; i<3; i++) 
     std::cout << c[i] << "\t"; 
} 

Wynik:

3  7  7 

Niestety, mimo że kod na dodanie do siebie valarrays jest prosty i czysty, valarray nigdy nie zyskał dużą popularność. W związku z tym mamy do czynienia z tą dość dziwną sytuacją, w której nawet powyższy kod, który wydaje mi się bardzo czysty, bezpośredni i czytelny, nadal kwalifikuje się jako zaciemniony, po prostu dlatego, że tak mało ludzi jest do tego przyzwyczajonych.

+0

+1 ah naprawdę fajne, nie wiedziałem, że to wektoryzowana tablica. Rozumiem, że działa również z wszystkimi innymi operatorami arytmetycznymi. – TemplateRex

+0

ah, nie wiedziałem, że istnieje, może się przydać kiedyś. –

+0

@TemplateRex: Tak, prawie wszystkie z nich. Możesz także robić rzeczy takie jak 'valarray + int', aby dodać liczbę do każdego członka walarray (np. W powyższym przykładzie,' c + 1' dałoby '4 8 8'). –

Powiązane problemy