Bonsoir,
Voilà je planche depuis quelques temps sur ce problème
Voici mes définitions de classes :
Code :
- class indice {
- int cf;
- [...]
- };
- struct SortByCf
- {
- bool operator ()(const vector<indice>::iterator& a1, const vector<indice>::iterator& a2) const
- {
- return a1->cf > a2->cf;
- }
- };
|
Et voici le bout de code posant problème :
Code :
- vector<indice> l_indices;
- vector<indice>::iterator it = l_indices.begin();
- vector<vector<indice>::iterator> l_iIndices;
- [...] // On remplit l_indices ici, tout se passe bien
- for (; it != l_indices.end(); it++) l_iIndices.push_back(it);
- // On tri le vecteur d'itérateurs
- std::sort(l_iIndices.begin(), l_iIndices.end(), SortByCf());
- // Maintenant on veut effacer l_indices en ne gardant que les deux plus grand "cf"
- for ( vector<vector<indice>::iterator>::iterator iMit = l_iIndices.begin() + 2; iMit != l_iIndices.end(); iMit ++ ) l_indices.erase(*iMit);
|
Au final j'ai une erreur mémoire.
En plaçant un point d'arrêt avant la dernière boucle for je me suis rendu compte que le vecteur l_iIndices est vide.
Après vérification, le vecteur l_iIndices est remplit convenablement avant le sort.
J'ai donc pensé à écrire une fonction sort simple moi même, même erreur...
Pour info voici son code :
Code :
- void SortIterByCf(vector<vector<indice>::iterator>& l_iIndices) {
- bool done = false;
- while ( !done ) {
- unsigned int nbChanges = 0;
- vector<vector<indice>::iterator>::iterator iMit = l_iIndices.begin();
- while ( (iMit+1) != l_iIndices.end() ) {
- if ( (*iMit)->cf < (*(iMit+1))->cf ) {
- vector<indice>::iterator temp;
- temp = *(iMit+1);
- *(iMit+1) = *iMit;
- *iMit = temp;
- nbChanges++;
- }
- iMit++;
- }
- if ( nbChanges > 0 ) done = true;
- }
- }
|
J'espère avoir été assez clair, n'hésitez pas à me poser des questions.
Merci de m'avoir lu !
Message édité par Arry le 17-07-2009 à 15:22:46
---------------
Mon Feed-Back