2012-05-22 38 views
8

Tôi có một số vector<MyType> và muốn một số khác vector<MyType> chỉ chứa những MyTypes đáp ứng một số tiêu chí đơn giản, ví dụ: rằng một số thành viên dữ liệu bằng một cái gì đó. Cách tốt nhất để giải quyết vấn đề này là gì?Làm cách nào để lọc hoặc "grep" một vector C++?

Trả lời

17

Sử dụng copy_if:

#include <algorithm> // for copy_if 
#include <iterator> // for back_inserter 

std::vector<MyType> v2; 
std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2), 
      [](MyType const & x) { return simple_citerion(x); }); 
+2

Chết tiệt, 10 giây! +1 – Xeo

+2

Nhưng điều quan trọng cần lưu ý là 'copy_if' chỉ có trong C++ 11, phải không? –

+4

@EitanT: Bạn có thể lạm dụng 'remove_copy_if' cho C++ 03, bằng cách đảo ngược biến vị ngữ. – Xeo

7

Sử dụng một chút Boost, bạn có thể:

std::vector<int> v = {1,2,-9,3}; 

for (auto i : v | filtered(_arg1 >=0)) 
    std::cout << i << "\n"; 

Mẫu này sử dụng Phoenix cho lambdas ngầm được xác định bởi mẫu biểu thức (_arg1 >= 0), nhưng bạn có thể sử dụng bất kỳ cuộc gọi nào (C++ 03 hoặc cao hơn) với bộ điều hợp Tăng cường (được lắp ghép, chuyển đổi, đảo ngược, v.v.)

Xem ở đây để xem thêm tài liệu giới thiệu và một ful l Ví dụ:

+0

Một cách hay khác, và bạn có thể mở rộng Boost.Range để tạo một vectơ mới từ kết quả được lọc, nếu bạn cần, mà không lưu kết quả tạm thời. – Xeo

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