2009-02-09 6 views
14

저는 정수 벡터를 가지고 있으며 쌍의 벡터로 변환하려고합니다 (쌍은 bool과 int로 구성됩니다). 현재 코드는 다음과 같이 간단합니다.변환을 사용하여 새 벡터 만들기

std::vector<int> a; 
    std::vector<std::pair<bool,int> > b; 

    a.push_back(1); 
    a.push_back(2); 
    a.push_back(3); 

    for(int i = 0; i < a.size(); ++i) 
    { 
     b.push_back(std::make_pair(false, a[i])); 
    } 

루프를 직접 작성하지 않으면 어떤 방법이 있을까요? 아마도 일부 알고리즘을 사용하고 있을까요? 이 그것보다 가치가 더 문제가 될 증명할 수 있지만

struct F { 
    F(std::vector<std::pair<bool,int> > &b) : m_b(b){ 
    } 

    void operator()(int x) { 
     m_b.push_back(std::make_pair(false, x)); 
    } 

    std::vector<std::pair<bool,int> > &m_b; 
}; 

std::for_each(a.begin(), a.end(), F(b)); 

:

답변

15

1. 당신은 펑터와 std::for_each을 만들 수 있습니다. 하지만 적어도 재사용이 가능할 것입니다. :)

아마도 boost::bind으로 할 수있는 것이 있습니다.

2. 편집 : 나는 당신이 back inserter로 바인드를 사용하고 변환 할 수 있다고 생각했습니다. 이 같은 :

std::transform(a.begin(), a.end(), std::back_inserter(b), boost::bind(std::make_pair<bool, int>, false, _1)); 

나는 내가이 일을해야 생각하지만 난 단지 그것을 boost::bind을 성공적으로 얻을 수 std::bind1st와 함께이 시도. 나는 ... 노력하겠습니다

3. 편집 : 여기가 아닌 부스트 솔루션입니다 :

std::transform(a.begin(), a.end(), std::back_inserter(b), std::bind1st(std::ptr_fun(std::make_pair<bool, int>), false)); 

4. 편집 : 여기 내 현재있는 C++ (11) 솔루션 (의) 좋아하는 :

std::for_each(begin(a), end(a), [&b](int v) { 
    b.push_back(std::make_pair(false, v)); 
}); 

또는 간단한 :

for(int v : a) { 
    b.push_back(std::make_pair(false, v)); 
} 
+1

목 anks .. 나는이 일을하는 것보다 간단한 방법이되기를 바랐다. 또한 생성자에 전달 된 매개 변수가 const 참조가 아니므로 응답을 편집 할 수있다. 나는 표준 STL 알고리즘을 가지고 살기 위해 부스트를 사용하지 않고있다. – Naveen

+0

좋은 const에 대한 호출, const로 기본 설정하는 습관의 힘 :) –

+0

@patryk, 숫자 4 - C++ 11은 여전히'vector :: insert'에 대한 인수로 위치와 값을 필요로하지만, 그렇지 않습니다. ? (예 : [here] (http://www.cplusplus.com/reference/vector/vector/insert/)를 참조하십시오.)'push_back() '을 의미 했습니까? – phlummox

관련 문제