1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| struct Data
{
std::string id; // l'identifiant
size_t begin; // la valeur de depart de l'intervale
size_t end; // la valeur de fin d'intervale
/* l'algorithme a juste besoin de pouvoir comparer deux structures
* afin de déterminer si la première est plus petite que la deuxième
*/
bool operator<(Data const& d2)
{
/* Ce qui va bien pour assurer que l'objet en cours est plus petit
* que l'objet "d2"
*/
}
};
void foo(std::string const& file1, std::string const& file2)
{
std::ifstream first(file1.c_str());
std::ifstream second(file2.c_str());
std::list<Data> firstData; // la liste des données du premier fichier
std::list<Data> secondData; // la liste des données du deuxième fichier
std::string temp;
while(std::getline(first, temp)) // tant qu'il y a des valeurs à récupérer
// dans le premier fichier
{
// nous convertissons les informations
std::stringstream ss;
ss<<temp;
Data dat;
ss>>dat.id>>dat.begin>>dat.end;
// et nous insérons la données dans la première liste
firstData.push_back(dat);
/* juste l'affichage de l'objet récupéré, pour nous assurer qu'il a
* été correctement lu
*/
std::cout<<"lu "<<dat.id<<"\t"<<dat.begin<<"\t"<<dat.end<<std::endl;
}
/* ceci aussi n'est qu'une vérification visuelle ;) */
std::cout<<firstData.size()<<" donnees lues dans le premier fichier"
<<std::endl;
while(std::getline(second, temp)) // tant qu'il y a des valeurs à
// récupérer dans le deuxième fichier
{
// nous convertissons les informations
std::stringstream ss;
ss<<temp;
Data dat;
ss>>dat.id>>dat.begin>>dat.end;
// et nous insérons la données dans la deuxième liste
secondData.push_back(dat);
/* juste l'affichage de l'objet récupéré, pour nous assurer qu'il a
* été correctement lu
*/
std::cout<<"lu "<<dat.id<<"\t"<<dat.begin<<"\t"<<dat.end<<std::endl;
}
std::cout<<secondData.size()<<" donnees lues dans le deuxieme fichier "
<<std::endl;
/* Nous allons utiliser un vector pour le résultat car il permet l'acces
* aléatoire aux itérateurs...
*
* Nous savons que, quoi qu'il arrive, il sera composé d'un nombre
* d'éléments au
* maximum égal au nombre le plus petit d'élément des deux listes
*/
std::vector<Data> result(secondData.size()< firstData.size()?
secondData.size() : firstData.size());;
/* set_intersection renvoie un itérateur sur le dernier élément placé
* ... profitons-en ;)
*/
std::vector<Data>::iterator it = std::set_intersection(
firstData.begin(), firstData.end(),
secondData.begin(),secondData.end(),
result.begin());
/* affichons le nombre d'éléments similaires trouvés */
std::cout<<int(it-result.begin())<<" elements similaires trouves"
<<std::endl;
} |
Partager