2013-08-24 2 views
0

Я работаю с STL, но у меня нет C++ 0x, и я не могу использовать boost, мне интересно, есть ли способ связать 2 или более аргумента функтора при использовании станд :: генерировать? Что-то вродеstl functor с более чем 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. BTW, поддерживает std :: bind в C++ 0x и/или C++ 11?

+0

'main' должен иметь тип возврата' int'. – chris

+0

Что это за '_' часть, исходящая от вектора? Это начальное значение, которое могут содержать векторные элементы? – Mahesh

+0

привет Махеш, код, который я публикую, не существует, я просто хочу показать идею, которую я хочу реализовать. _ обозначает элементы вектора. – 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 lambdas - это то, что вы можете просто написать код, который вы хотите, без всех лесов, определяющих структуру.

Смежные вопросы