Criteri di ordinamento dinamico via Boost bind

Rileggendo Beyond the C++ Standard Library: An Introduction to Boost di Björn Karlsson.

Parte sull'uso di bind, nel capitolo nove, all'interno della terza parte, dedicata ai functor e alla programmazione di più alto ordine.

Un utilizzo di boost::bind é in connessione con l'uso di sort su di un container. Infatti permette di creare sul posto una regola per l'ordinamento del container.

Nell'esempio che segue vediamo come ordinare un vettore di oggetti di una classe che non é fornita di operatori di ordinamento:

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

#include "boost/bind.hpp"

using namespace std;

class PersonalInfo {
string name_;
string surname_;
unsigned int age_;

public:
PersonalInfo(const string& n, const string& s, unsigned int age) :
name_(n), surname_(s), age_(age) {}

string name() const {
return name_;
}

string surname() const {
return surname_;
}

unsigned int age() const {
return age_;
}
};

ostream& operator<< (ostream& os, const PersonalInfo& pi) {
os << pi.name() << ' ' << pi.surname() << ' '
<< pi.age() << endl;
return os;
}

void dump(vector<PersonalInfo>& vec) {
vector<PersonalInfo>::const_iterator it = vec.begin();
while(it != vec.end()) {
cout << *it++;
}
cout << endl;
}

void bind03() {
vector<PersonalInfo> vec;
vec.push_back(PersonalInfo("Little", "John", 30));
vec.push_back(PersonalInfo("Friar", "Tuck", 50));
vec.push_back(PersonalInfo("Robin", "Hood", 40));
dump(vec);

cout << "By age:" << endl;
sort(vec.begin(), vec.end(), boost::bind(
less<unsigned int>(),
boost::bind(&PersonalInfo::age, _1),
boost::bind(&PersonalInfo::age, _2)));
dump(vec);

cout << "By surname:" << endl;
sort(vec.begin(), vec.end(), boost::bind(
less<string>(),
boost::bind(&PersonalInfo::surname, _1),
boost::bind(&PersonalInfo::surname, _2)));
dump(vec);
}

La prima sort viene eseguita usando la funzione age() e l'operatore less, il secondo con surname().

Nessun commento:

Posta un commento