2009-02-09 28 views
14

Tôi có một vectơ các số nguyên và tôi muốn chuyển đổi nó thành một vectơ các cặp (cặp bao gồm một bool và một int). Mã hiện tại của tôi rất đơn giản như sau:Tạo một véc tơ mới bằng cách sử dụng một biến đổi

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])); 
    } 

Có cách nào để thực hiện việc này mà không cần tự viết vòng lặp không? Có lẽ sử dụng một số thuật toán?

Trả lời

15

1. Bạn có thể làm một functor và std::for_each:

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

Mặc dù điều này có thể chứng minh được rắc rối hơn nó có giá trị. Nhưng ít nhất nó sẽ được tái sử dụng :).

Có thể có điều gì đó có thể thực hiện với boost::bind.

2. EDIT: Tôi đã nghĩ rằng bạn có thể sử dụng liên kết với trình rút gọn và chuyển đổi ngược lại. một cái gì đó như thế này:

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

Tôi cố gắng này với std::bind1st, tôi nghĩ rằng nó nên đã làm việc, nhưng tôi chỉ có thể làm cho nó thành công với boost::bind. Tôi sẽ tiếp tục cố gắng ...

3. EDIT: đây là một giải pháp không tăng:

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

4. EDIT: đây là một giải pháp C++ 11 (đó là hiện tại của tôi yêu thích):

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

hoặc thậm chí đơn giản hơn:

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

Th anks .. Tôi đã hy vọng sẽ có cách đơn giản hơn làm điều này .. Ngoài ra bạn có thể chỉnh sửa câu trả lời để tham số truyền cho constructor không phải là một tham chiếu const. Tôi không sử dụng boost vì vậy tôi đã sống với các thuật toán STL tiêu chuẩn. – Naveen

+0

gọi tốt trên const, sức mạnh của thói quen mặc định thành const :) –

+0

@patryk, cho số 4 - C++ 11 vẫn yêu cầu cả vị trí và giá trị làm đối số cho 'vector :: insert', đúng không ? (xem ví dụ: [tại đây] (http://www.cplusplus.com/reference/vector/vector/insert/).) Bạn có nghĩa là 'push_back()' không? – phlummox

Các vấn đề liên quan