2013-08-24 88 views
0

我正在使用STL,但我沒有C++ 0x和我不能使用boost,我不知道是否有反正綁定2個或更多的參數使用仿函數的std ::產生?類似於stl仿函數超過2個參數

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

using namespace std; 

float f(int x, float y, float z) {return x*(y+z);} 

int main(void) 
{ 
    std:vector<int> v(100); 
    float x=1.2, y=-3.3; 
    generate(v.begin(), v.end(), bind3argu(f, _, x, y)); // something like this: '_' is from vector 

    // as suggested, I also try 
    generate(v.begin(), v.end(), std::bind(f, x, y)); 
    return 0; 
} 

我嘗試使用std :: bind,但它不能用g ++ 4.4.6編譯。順便說一句,std :: bind只支持C++ 0x和/或C++ 11嗎?

+0

'main'需要有'int'返回類型。 – chris

+0

這是什麼'_'部分來自矢量?這是矢量元素可能包含的初始值嗎? – Mahesh

+0

嗨Mahesh,我發佈的代碼並不存在,我只是想展示我想要實現的想法。 _代表矢量的元素。 – user1285419

回答

0

如果您打算使用仿函數,請嘗試使用std::transform

float foo(float z) { 
    float x=1.2, y=-3.3; 
    return x*(y+z); 
} 

std::transform(v.begin(), v.end(), v.begin(), foo); 

如何傳遞向量值的真正問題。如果不是這樣的話,std::bind會很有用。

std::generate(v.begin(), v.end(), std::bind(f, x, y /*Any number of varaibales*/)); 
+0

thx,但是如果x和y是常量變量會發生什麼,即如果可能會不時變化並需要作爲參數饋入 – user1285419

+0

查看更新。只要不想使用向量元素的初始值,就可以使用'std :: bind'。 – Mahesh

+0

謝謝。我嘗試在問題中更新的代碼中使用std :: bind。但它不編譯。我錯過了什麼?謝謝 – user1285419

0

你當然可以編寫自己的函數來做任何你想要的。

例如:(未經測試的代碼,可能需要指針而不是引用)

struct Three { 
    Three (float &x, float &y) : x_(x), y_(y) {} 
    float operator (float z) const { /* do something with x_,y_ and z */ } 
private: 
    float &x_; 
    float &y_; 
}; 

,然後你可以說:

float x=1.2, y=-3.3; 
Three three (x, y); 
generate(v.begin(), v.end(), three); 

bind1st的優勢,或升壓::綁定,或C++ 11 lambda表達式就是你可以只寫代碼而不用定義結構的所有腳手架。