2009-10-10 7 views
1

나는 v1v2을 가지고 있는데, 어떻게하면 아래처럼 새로운 v을 얻어야합니까?STL 알고리즘으로 두 배열 (벡터)의 조합을 얻는 방법은 무엇입니까?

v1 = {1,2} 
v2 = {3,4,5} 

v = {f(1,3) , f(1,4) , f(1,5) f(2,3) ,f(2,4) ,f(2,5)} 

가 나는 두 개의 루프를 사용하여 할 수있는 알고있다, 그러나 STL 알고리즘을 사용하여 같은 더 관용적 방법이 있다면?

//using two loops 
for iter1 of v1 
    for iter2 of v2 
      v.push_back(f(v1,v2)) 

편집 :

v1 필요 v2되지는 같은 크기를 가지고있다.

+0

? : http://stackoverflow.com/questions/215908/whats-a-good-non-recursive-algorithm-to-calculate-a-cartesian-product – anno

+0

이것은 거의 정확히 당신이 요구하는 것과 같습니다 : [http : //stackoverflow.com/questions/979436(http://stackoverflow.com/questions/979436) –

답변

1

더 적절한 STL 알고리즘하지만, 사용자 정의 기능과 표준에 의해 할 수이 조합 :: 생성 없습니다 :

직교 제품을 계산할 수있는 좋은 비 재귀 알고리즘은 무엇
#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <iterator> 

typedef int T; 

struct Fctor 
{ 
    typedef std::vector<T>::iterator Iterator; 
    Iterator it1, it2, begin, end; 

    Fctor(Iterator begin1, Iterator end1, Iterator begin2) 
    { 
     begin = begin1; 
     end = end1; 
     it1 = begin1; 
     it2 = begin2; 
    } 

    T operator()() 
    { 
     // T result = f(*it1, *it2); 
     T result = (*it1) * (*it2); 

     if(++it1 != end) return result; 
     it1 = begin; 
     ++ it2; 
     return result; 
    } 
}; 


int main() 
{ 
    std::vector<T> v1; v1.push_back(1); v1.push_back(2); 
    std::vector<T> v2; v2.push_back(3); v2.push_back(4); v2.push_back(5); 
    std::vector<T> result(v1.size() * v2.size()); 

    Fctor fctor(v2.begin(), v2.end(), v1.begin()); 
    generate(result.begin(), result.end(), fctor); 

    std::copy(result.begin(), result.end(), 
       std::ostream_iterator<T>(std::cout, " ")); 
    std::cout << std::endl; 
    // => 3 4 5 6 8 10 
}