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));
}
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
gọi tốt trên const, sức mạnh của thói quen mặc định thành const :) –
@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