2009-04-27 34 views

Trả lời

7

Vì C++ 0x chưa hoàn tất, bạn chỉ có thể xem draft gần đây nhất.

+2

Raptor ngọt Chúa Giêsu, có nó được. – rlbond

+1

Hiện tại, C++ 0x được hoàn thiện khá tốt và bản nháp gần đây nhất là gần giống với phiên bản cuối cùng. –

+0

Tôi đồng ý, tôi chỉ đọc rằng gcc 4.4 đã có một số hỗ trợ cho bản nháp. –

5

Trong khi đó, nó không phải là rất khó để làm của riêng copy_if() bạn sử dụng remove_copy_if():

#include <functional> 

struct my_predicate : std::unary_function<my_arg_type, bool> { 
    bool operator()(my_arg_type const& x) const { ... } 
}; 

// To perform "copy_if(x, y, z, my_predicate())", write: 
remove_copy_if(x, y, z, std::not1(my_predicate())); 

Sử dụng not1() đòi hỏi lớp ngữ của bạn để cung cấp một loại lồng nhau, argument_type, xác định kiểu của đối số - như được hiển thị ở trên, một cách thuận tiện để thực hiện việc này là lấy từ số unary_function<T, U>, trong đó T là loại đối số.

4

Chỉ cần cho đầy đủ, trong trường hợp ai đó Googles/cách của mình cho câu hỏi này, cần phải nói rằng bây giờ (trong C++ 11 và sau) một thuật toán copy if. Nó hoạt động như mong đợi (sao chép các phần tử trong một phạm vi, mà một số biến vị ngữ trả về true, đến một phạm vi khác).

Một trường hợp sử dụng điển hình sẽ là

std::vector<int> foo{ 25, 15, 5, -5, -15 }; 
std::vector<int> bar; 

// copy only positive numbers: 
auto it = std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), 
      [](int i){return !(i<0); 
      });