Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing a parameter to a comparison function?

Tags:

c++

sorting

stl

When using the STL sort algorithm on a vector, I want to pass in my own comparison function which also takes a parameter.

For example, ideally I want to do a local function declaration like:

int main() {     vector<int> v(100);     // initialize v with some random values      int paramA = 4;      bool comp(int i, int j) {         // logic uses paramA in some way...     }      sort(v.begin(), v.end(), comp); } 

However, the compiler complains about that. When I try something like:

int main() {     vector<int> v(100);     // initialize v with some random values      int paramA = 4;      struct Local {         static bool Compare(int i, int j) {             // logic uses paramA in some way...         }     };      sort(v.begin(), v.end(), Local::Compare); } 

The compiler still complains: "error: use of parameter from containing function"

What should I do? Should I make some global variables with a global comparison function..?

Thanks.

like image 333
George41 Avatar asked Nov 01 '10 04:11

George41


People also ask

How do you pass a comparator function in C++?

template <typename T, typename F> bool compare_values(T const& obj, T const& value, F comparator) { return comparator(obj, value); } bool equal = compare_values(1, 1, less_class<int>{}); Though all of your operator() 's are currently private , which isn't particularly useful.

What is a comparison function in C?

strcmp() in C/C++ This function is used to compare the string arguments. It compares strings lexicographically which means it compares both the strings character by character. It starts comparing the very first character of strings until the characters of both strings are equal or NULL character is found.

What does compare function return C?

The compare() function in C++ Returns 0, if both the strings are the same. Returns <0, if the value of the character of the first string is smaller as compared to the second string input. Results out to be >0, when the second string is greater in comparison.


2 Answers

You cannot access the local variables of a function from within a locally defined function -- C++ in its current form does not allow closures. The next version of the language, C++0x, will support this, but the language standard has not been finalized and there is little support for the current draft standard at the moment.

To make this work, you should change the third parameter of std::sort to be an object instance instead of a function. The third parameter of std::sort can be anything that is callable (i.e. any x where adding parentheses like x(y, z) makes syntactic sense). The best way to do this is to define a struct that implements the operator() function, and then pass an instance of that object:

struct Local {     Local(int paramA) { this->paramA = paramA; }     bool operator () (int i, int j) { ... }      int paramA; };  sort(v.begin(), v.end(), Local(paramA)); 

Note that we have to store paramA in the structure, since we can't access it otherwise from within operator().

like image 170
Adam Rosenfield Avatar answered Oct 08 '22 01:10

Adam Rosenfield


In C++ you cannot define a free function inside another function. So your first code snippet is ill formed.

sort(v.begin(), v.end(), Local::Compare);

The 3rd argument must be a function object. Overload () operator inside the class and then create the function object.


In C++0x you can use lambda expressions.

auto comp = [&](int m,int n)-> bool {          return m<n; //or use paramA in some way     };  sort(v.begin(), v.end(), comp); 
like image 33
Prasoon Saurav Avatar answered Oct 08 '22 00:10

Prasoon Saurav