2011-07-28 21 views
5
vector<int> vwInts; 
vector<int> vwIntsB; 

for(int i=0; i<10; i++) 
    vwInts.push_back(i); 

transform(vwInts.begin(), vwInts.end(), inserter(vwIntsB, vwIntsB.begin()), 
     bind1st(plus<int>(), 5)); // method one 

transform(vwInts.begin(), vwInts.end(), inserter(vwIntsB, vwIntsB.begin()), 
     bind2nd(plus<int>(), 5)); // method two 

Tôi biết sự khác biệt về cách sử dụng giữa bind1st và bind2nd và cả phương pháp một và phương thức hai đều cung cấp kết quả mong đợi cho tôi.Sử dụng bind1st hoặc bind2nd?

Có đúng là không có sự khác biệt lớn trong trường hợp này (tức là sử dụng biến đổi) để tôi có thể sử dụng hoặc bind1st hoặc bind2nd?

Vì, tất cả các ví dụ tôi đã thấy cho đến nay luôn sử dụng phương pháp hai. Tôi muốn biết có hay không bind1st và bind2nd trong trường hợp trên là như nhau.

+0

tôi sẽ khuyên bạn nên nhìn vào boost :: ràng buộc nếu bạn chưa có. Nó linh hoạt hơn và mạnh mẽ hơn bind1st và bind2nd. –

Trả lời

4

bind1st liên kết thông số đầu tiên của hàm trong khi bind2nd liên kết thông số thứ hai. Vì hai kiểu tham số giống nhau trong trường hợp này và operator+ là đối xứng nên không có sự khác biệt.

3

Trong trường hợp này, chúng sẽ dịch tương ứng thành 5 + a và + 5, được biên dịch thành chính xác như nhau.

6

bind1st liên kết thông số đầu tiên của plus<int>() functor và bind2nd liên kết thông số thứ hai. Trong trường hợp plus<int>, nó không tạo ra bất kỳ sự khác biệt nào, vì 10+2020+10 giống nhau.

Nhưng nếu bạn làm điều đó với minus<int>, nó sẽ tạo sự khác biệt, như 10-2020-10 không giống nhau. Chỉ cần thử làm điều đó.

Minh họa:

int main() { 
    auto p1 = bind1st(plus<int>(),10); 
    auto p2 = bind2nd(plus<int>(),10); 
    cout << p1(20) << endl; 
    cout << p2(20) << endl; 

    auto m1 = bind1st(minus<int>(),10); 
    auto m2 = bind2nd(minus<int>(),10); 
    cout << m1(20) << endl; 
    cout << m2(20) << endl; 
    return 0; 
} 

Output:

30 
30 
-10 
10 

Demo: http://ideone.com/IfSdt

0

Đối với trường hợp cụ thể của bạn

bind1st() 

bind2nd() 

cùng.

Như vậy là bởi vì, plus() hàm operator nhị phân trông giống như dưới đây

plus(arg1, arg2) 

Vì vậy, khi bạn sử dụng bind1st(plus<int>(), 5) cuộc gọi đến cộng sẽ trông như dưới

plus(5, vwInts) 

như vậy, ở trên sẽ thêm mọi phần tử của vector có giá trị 5

Và khi bạn sử dụng bind2nd(plus<int>(), 5) cuộc gọi đến cộng với wou ld trông như dưới

plus(vwInts, 5) 

như vậy, ở trên sẽ thêm mọi phần tử vectơ có giá trị 5.

Do đó cả hai đều giống nhau trong trường hợp của bạn

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