Вот еще одна адаптация примера, в которой используются два разных вида предикатов. Указанный предикат может быть указателем на функцию или функтором, который является классом, который определяет operator (), так что объект при создании экземпляра может использоваться точно так же, как и функция. Обратите внимание, что мне пришлось добавить еще одно включение заголовка в функциональный заголовок. Это потому, что функтор наследует от функции binary_function, которая определена в библиотеке std.
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class MyData
{
public:
static bool compareMyDataPredicate(MyData lhs, MyData rhs) { return (lhs.m_iData < rhs.m_iData); }
// declare the functor nested within MyData.
struct compareMyDataFunctor : public binary_function<MyData, MyData, bool>
{
bool operator()( MyData lhs, MyData rhs)
{
return (lhs.m_iData < rhs.m_iData);
}
};
int m_iData;
string m_strSomeOtherData;
};
int main()
{
// Create a vector that contents elements of type MyData
vector<MyData> myvector;
// Add data to the vector
MyData data;
for(unsigned int i = 0; i < 10; ++i)
{
data.m_iData = i;
myvector.push_back(data);
}
// shuffle the elements randomly
std::random_shuffle(myvector.begin(), myvector.end());
// Sort the vector using predicate and std::sort. In this case the predicate is a static
// member function.
std::sort(myvector.begin(), myvector.end(), MyData::compareMyDataPredicate);
// Dump the vector to check the result
for (vector<MyData>::const_iterator citer = myvector.begin();
citer != myvector.end(); ++citer)
{
cout << (*citer).m_iData << endl;
}
// Now shuffle and sort using a functor. It has the same effect but is just a different
// way of doing it which is more object oriented.
std::random_shuffle(myvector.begin(), myvector.end());
// Sort the vector using predicate and std::sort. In this case the predicate is a functor.
// the functor is a type of struct so you have to call its constructor as the third argument.
std::sort(myvector.begin(), myvector.end(), MyData::compareMyDataFunctor());
// Dump the vector to check the result
for (vector<MyData>::const_iterator citer = myvector.begin();
citer != myvector.end(); ++citer)
{
cout << (*citer).m_iData << endl;
}
return 1;
}