2012-05-09 48 views

Trả lời

28

Có: std::for_each.

void foo(int a) { 
    std::cout << a << "\n"; 
} 

std::vector<int> v; 

... 

std::for_each(v.begin(), v.end(), &foo); 
+1

có thể mong đợi cải thiện tốc độ khi sử dụng điều này (trái ngược với vòng lặp) không? – dbliss

+2

@dbliss, việc thực hiện 'for_each()' có thể là một vòng lặp giống nhau và vì nó sử dụng các mẫu, nên không có sự khác biệt. Tuy nhiên, với C++ 17, họ có thể giới thiệu song song mà sẽ hoàn toàn minh bạch cho bạn và nó có thể rất tốt sẽ bắt đầu nhanh hơn. –

2

Bạn có thể sử dụng một cặp lặp và chức năng hoặc hàm.

8

Sử dụng for_each:

// for_each example 
#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

void myfunction (int i) { 
    cout << " " << i; 
} 

struct myclass { 
    void operator() (int i) {cout << " " << i;} 
} myobject; 

int main() { 
    vector<int> myvector; 
    myvector.push_back(10); 
    myvector.push_back(20); 
    myvector.push_back(30); 

    cout << "myvector contains:"; 
    for_each (myvector.begin(), myvector.end(), myfunction); 

    // or: 
    cout << "\nmyvector contains:"; 
    for_each (myvector.begin(), myvector.end(), myobject); 

    cout << endl; 

    return 0; 
} 
6

Nếu bạn có C++ 11, có một phương pháp thậm chí ngắn hơn: ranged-based for. Mục đích của nó là chính xác điều này.

std::vector<int> v {1,2,3,4,5}; 

for (int element : v) 
    std::cout << element; //prints 12345 

Bạn cũng có thể áp dụng tham chiếu và const cho nó, khi thích hợp hoặc sử dụng tự động khi loại đó dài.

std::vector<std::vector<int>> v {{1,2,3},{4,5,6}}; 

for (const auto &vec : v) 
{ 
    for (int element : vec) 
     cout << element; 

    cout << '\n'; 
} 

Output:

123 
456 
+0

Cú pháp này chưa được hỗ trợ bởi vs2011 chẳng hạn. Ít nhất không phải bản sao của tôi.Nhưng +1. – ervinbosenbacher

+0

@xebo, ah, điều đó không thể thấy được vì đây là một trong những tính năng tốt nhất của C++ 11 imo. – chris

+0

Đối với bất kỳ khách truy cập nào trong tương lai, phạm vi đã được thêm vào Visual Studio 2012. – chris

27

Bạn đã nhận được vài câu trả lời nhắc std::for_each.

Trong khi những câu trả lời này cho câu hỏi bạn đã hỏi, tôi sẽ thêm ít nhất theo kinh nghiệm của tôi, std::for_each là về ít nhất hữu ích của các thuật toán chuẩn.

Tôi sử dụng (cho một ví dụ) std::transform, về cơ bản là a[i] = f(b[i]); hoặc result[i] = f(a[i], b[i]); nhiều hơn thường xuyên hơn std::for_each. Nhiều người thường xuyên sử dụng std::for_each để in các phần tử của bộ sưu tập; vì mục đích đó, std::copy với số std::ostream_iterator làm điểm đến hoạt động tốt hơn nhiều.

+3

Đây là câu trả lời tôi đang tìm kiếm, 'transform' gần với' map' của Python hơn 'for_each', vì' map' tạo ra một danh sách các đầu ra, trong khi 'for_each' gọi hàm nhưng loại bỏ kết quả đầu ra. –

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