2013-06-07 15 views
7

(ister C++ 11 veya boost olarak) Böyle bir şeyi yapmak yardımcı olabilir:algoritması içine iki aralıkları değerleri ekleyin ve bunları yerleştirmek için üçüncü bir tek şey olup olmadığını ben sadece merak

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>()); 

sonucu elbette {3, 7, 7} olmalı ve std :: plus yerine herhangi bir binary_function olabilir.

Eğer birisinin bir fikri varsa, bana bildirin.

+0

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

cevap

9

Bunun için 5 parametre aşırı yükünü std::transform kullanabilirsiniz. Bu iki aralıkları eleman çiftleri üzerinde çalışmak üzere bir ikili functor alır: Sadece eğlence için, ben std::vector ve std::transform alternatif işaret edeceğiz

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

oh Tamam Beş parametreli bir sürüm olduğunu bilmiyordum. Daha iyi bakmalıydım, çok teşekkürler. –

+0

+1 zaten bir std functor için bir lambda kullanmak için günaha direnmek için. –

12

. Bunun yerine std::valarray'u kullanabilirsiniz.

#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"; 
} 

Sonuç:

3  7  7 

Maalesef araya valarrays eklemek için kod basit ve temiz olmasına rağmen valarray çok popülerlik kazanmıştır olmamıştı. Böylelikle, bu kadar garip bir durumla karşı karşıya kaldık, çünkü yukarıdaki gibi kodların beni çok temiz, açık ve okunaklı olarak vurması bile, neredeyse pek az insanın alışık olduğu için neredeyse gizlenmiş olarak nitelendiriliyor.

+0

+1 ah gerçekten harika, bunun bir vektörleştirilmiş dizi olduğunu bilmiyordum. Onu aldığımda, diğer tüm aritmetik işleçlerle de çalışır. – TemplateRex

+0

ah, ya var olduğunu bilmiyordum, bir gün kullanışlı olabilir. –

+0

@TemplateRex: Evet, neredeyse hepsi. Ayrıca valarray öğesinin her üyesine bir sayı eklemek için valarray + int gibi şeyler de yapabilirsiniz (ör., Yukarıdaki örnekte, "c + 1", "4 8 8" değerini verir). –