repairer dispatcher may be used with an unordered vector of indexes, thus we use a vector and not a set

This commit is contained in:
nojhan 2011-10-14 10:34:33 +02:00
commit 99d1a08e7c
2 changed files with 14 additions and 15 deletions

View file

@ -29,7 +29,6 @@ Authors:
#define _edoRepairerDispatcher_h #define _edoRepairerDispatcher_h
#include <vector> #include <vector>
#include <set>
#include <utility> #include <utility>
#include "edoRepairer.h" #include "edoRepairer.h"
@ -52,28 +51,28 @@ template < typename EOT >
class edoRepairerDispatcher class edoRepairerDispatcher
: public edoRepairer<EOT>, : public edoRepairer<EOT>,
std::vector< std::vector<
std::pair< std::set< unsigned int >, edoRepairer< EOT >* > std::pair< std::vector< unsigned int >, edoRepairer< EOT >* >
> >
{ {
public: public:
//! Empty constructor //! Empty constructor
edoRepairerDispatcher() : edoRepairerDispatcher() :
std::vector< std::vector<
std::pair< std::set< unsigned int >, edoRepairer< EOT >* > std::pair< std::vector< unsigned int >, edoRepairer< EOT >* >
>() >()
{} {}
//! Constructor with a single index set and repairer operator //! Constructor with a single index set and repairer operator
edoRepairerDispatcher( std::set<unsigned int> idx, edoRepairer<EOT>* op ) : edoRepairerDispatcher( std::vector<unsigned int> idx, edoRepairer<EOT>* op ) :
std::vector< std::vector<
std::pair< std::set< unsigned int >, edoRepairer< EOT >* > std::pair< std::vector< unsigned int >, edoRepairer< EOT >* >
>() >()
{ {
this->add( idx, op ); this->add( idx, op );
} }
//! Add more indexes set and their corresponding repairer operator address to the list //! Add more indexes set and their corresponding repairer operator address to the list
void add( std::set<unsigned int> idx, edoRepairer<EOT>* op ) void add( std::vector<unsigned int> idx, edoRepairer<EOT>* op )
{ {
assert( idx.size() > 0 ); assert( idx.size() > 0 );
assert( op != NULL ); assert( op != NULL );
@ -90,7 +89,7 @@ public:
EOT partsol; EOT partsol;
// j is an iterator that points on an uint // j is an iterator that points on an uint
for( std::set< unsigned int >::iterator j = ipair->first.begin(); j != ipair->first.end(); ++j ) { for( std::vector< unsigned int >::iterator j = ipair->first.begin(); j != ipair->first.end(); ++j ) {
partsol.push_back( sol.at(*j) ); partsol.push_back( sol.at(*j) );
} // for j } // for j
@ -101,9 +100,9 @@ public:
(*(ipair->second))( partsol ); (*(ipair->second))( partsol );
{ // copy back the repaired partial solution to sol { // copy back the repaired partial solution to sol
// browse partsol with uint k, and the idx set with an iterator (std::set is an associative tab) // browse partsol with uint k, and the idx set with an iterator (std::vector is an associative tab)
unsigned int k=0; unsigned int k=0;
for( std::set< unsigned int >::iterator j = ipair->first.begin(); j != ipair->first.end(); ++j ) { for( std::vector< unsigned int >::iterator j = ipair->first.begin(); j != ipair->first.end(); ++j ) {
sol[ *j ] = partsol[ k ]; sol[ *j ] = partsol[ k ];
k++; k++;
} // for j } // for j

View file

@ -43,13 +43,13 @@ int main(void)
edoRepairer<EOT>* rep1 = new edoRepairerFloor<EOT>(); edoRepairer<EOT>* rep1 = new edoRepairerFloor<EOT>();
edoRepairer<EOT>* rep2 = new edoRepairerCeil<EOT>(); edoRepairer<EOT>* rep2 = new edoRepairerCeil<EOT>();
std::set<unsigned int> indexes1; std::vector<unsigned int> indexes1;
indexes1.insert(0); indexes1.push_back(0);
indexes1.insert(2); indexes1.push_back(2);
std::set<unsigned int> indexes2; std::vector<unsigned int> indexes2;
indexes2.insert(1); indexes2.push_back(1);
indexes2.insert(3); indexes2.push_back(3);
edoRepairerDispatcher<EOT> repare( indexes1, rep1 ); edoRepairerDispatcher<EOT> repare( indexes1, rep1 );
repare.add( indexes2, rep2 ); repare.add( indexes2, rep2 );