2010-01-08 61 views
5

Giả sử có một danh sách các số nguyên [1,2,3,4,5] và một hàm bản đồ nhân mỗi phần tử với 10 và trả về danh sách đã sửa đổi là [10,20,30,40,50], với việc sửa đổi danh sách gốc. Làm thế nào điều này có thể được thực hiện hiệu quả trong c + +.Cách tạo hàm bản đồ trong C++?

+0

Đây có phải là bài tập về nhà không? –

+0

Xin lỗi ... Tôi đã sử dụng chuyển đổi và for_each, không thể hồi tưởng nó vào lúc này, tôi đã tìm kiếm tham số thứ tư trong for_each suy nghĩ rằng như biến đổi: ( – yesraaj

Trả lời

17

Dưới đây là một ví dụ:

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

int multiply(int); 

int main() { 
    vector<int> source; 
    for(int i = 1; i <= 5; i++) { 
    source.push_back(i); 
    } 

    vector<int> result; 
    result.resize(source.size()); 
    transform(source.begin(), source.end(), result.begin(), multiply); 

    for(vector<int>::iterator it = result.begin(); it != result.end(); ++it) { 
     cout << *it << endl; 
    } 
} 

int multiply(int value) { 
    return value * 10; 
} 
3

Nếu bạn có thể sử dụng nó, có lẽ ý tưởng tốt nhất là sử dụng một hàm trong Thư viện mẫu chuẩn. Ví dụ, bạn có thể muốn kiểm tra for_each hoặc transform, về cơ bản chỉ thực hiện điều đó.

4

tôi chỉ đăng bài này để minh họa sử dụng một functor trong chuyển đổi chứ không phải là một chức năng toàn cầu:

#include <cstdlib> 
#include <iostream> 
#include <algorithm> 
#include <functional> 
#include <iostream> 

using namespace std; 

struct MulBy : public std::unary_function<int, int> 
{ 
    MulBy(int v) : v_(v) {} 
    int operator()(int lhs) const 
    { 
     return lhs * v_; 
    } 
private: 
    int v_; 
}; 

int main() 
{ 
    int incoming[5] = {1, 2, 3, 4, 5}; 
    int result[5] = {0, 0, 0, 0, 0}; 
    transform(&incoming[0], &incoming[5], &result[0], MulBy(10)); 
    copy(&result[0], &result[5], ostream_iterator<int>(cout, " ")); 
    return 0; 
} 
0
#include <iostream> 
    #include <algorithm> 
    #include <vector> 
    #include <functional> 
    using namespace std; 

    struct MulBy : public std::unary_function<int, int> 
    { 
     MulBy(int v) : v_(v) {} 
     int operator()(int lhs) const 
     { 
      return lhs * v_; 
     } 
    private: 
     int v_; 
    }; 
    int main() 
    { 
     vector<int> ListOfNumber; 
     ListOfNumber.push_back(1); 
     ListOfNumber.push_back(2); 
     ListOfNumber.push_back(3); 
     ListOfNumber.push_back(4); 
     ListOfNumber.push_back(5); 
     vector<int> ListResult; 
     ListResult.resize(ListOfNumber.size()); 

     //Produces a new list 
     transform(ListOfNumber.begin(),ListOfNumber.end(),ListResult.begin(),MulBy(10)); 
    copy(ListOfNumber.begin(),ListOfNumber.end(),ostream_iterator<int>(cout,"\t")); 
     //Modifies the original list 
    transform(ListOfNumber.begin(),ListOfNumber.end(),ListOfNumber.begin(),MulBy(10)); 
    copy(ListResult.begin(),ListResult.end(),ostream_iterator<int>(cout,"\t")); 
     cin.get(); 
    } 
10

Dọc theo dòng @darids trả lời, nhưng C++ 03 (hiện tại tại thời điểm đăng bài gốc):

#include <vector> 
#include <algorithm> 
#include <functional> 

std::vector<int> src; 
std::vector<int> dst; 

std::transform(src.begin(), src.end(), 
       std::back_inserter(dst), 
       std::bind1st(std::multiplies<int>(), 10)); 
+0

Cảm ơn câu trả lời này, tôi đề nghị thêm các chỉ thị cần thiết bao gồm cho rõ ràng. – buttonupbub

+0

Hiện tại C++ sẽ sử dụng lambda thay vì bind1st – sv90

+0

@ sv90 chắc chắn, thời gian và C++ đã chuyển sang kể từ khi tôi đăng câu trả lời này! – msandiford

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