Originariamente inviato da freetom
in sostanza anche il vector mi si è caricato in tempi record (meno di un minuto) con i valori attesi...
Meno di un minuto?
A me nel vecchio thread delle 84000 righe ciascun vettore si caricava in meno di mezzo secondo!
Ti posto il codice che usavo (anche se è piuttosto poco efficiente nel confronto ed è templatizzato in maniera oscena).
codice:
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <stdexcept>
#include <utility>
using namespace std;
template<typename TipoBase, unsigned int NumeroColonne>
class RigaBase
{
private:
TipoBase elementi[NumeroColonne];
public:
RigaBase() { };
RigaBase(TipoBase Elementi[NumeroColonne])
{
for(unsigned int i=0; i<NumeroColonne; i++)
elementi[i]=Elementi[i];
};
TipoBase * Elementi() { return elementi; };
const TipoBase * ElementiConst() const { return elementi; };
bool operator==(const RigaBase<TipoBase, NumeroColonne> & right) const
{
bool ret=true;
for(unsigned int i=0; i<NumeroColonne; i++)
ret&=(elementi[i]==right.ElementiConst()[i]);
return ret;
}
};
template<typename CharType, typename TipoBase, unsigned int NumeroColonne>
basic_istream<CharType> & operator>>(basic_istream<CharType> & Stream, RigaBase<TipoBase, NumeroColonne> & Right)
{
for(unsigned int i=0; i<NumeroColonne; i++)
Stream>>Right.Elementi()[i];
return Stream;
}
void Confronta(const char * File1, const char * File2);
template<typename CharType, typename TipoOggetto>
void Carica(basic_istream<CharType> & InputStream, vector< TipoOggetto > & Contenitore)
{
TipoOggetto riga;
unsigned int contatore=0;
while(InputStream)
{
InputStream>>riga;
if(InputStream)
Contenitore.push_back(riga);
contatore++;
}
}
template<typename TipoOggetto>
void Confronta(vector< TipoOggetto > & Contenitore1, vector< TipoOggetto > & Contenitore2)
{
for(unsigned int i=0; i<Contenitore1.size(); i++)
{
for(unsigned int j=0; j<Contenitore2.size(); j++)
{
if(Contenitore1[i]==Contenitore2[j])
cout<<"\tFile 1:"<<i<<" = File 2:"<<j<<"\n";
}
}
}
template<typename TipoOggetto, typename CharType>
void Confronta(basic_istream<CharType> & Stream1, basic_istream<CharType> & Stream2)
{
vector<TipoOggetto> contenitore1, contenitore2;
clog<<"Caricamento file 1... "<<flush;
Carica(Stream1, contenitore1);
clog<<"completato. "<<contenitore1.size()<<" righe caricate."<<endl;
clog<<"Caricamento file 2... "<<flush;
Carica(Stream2, contenitore2);
clog<<"completato. "<<contenitore2.size()<<" righe caricate."<<endl;
clog<<"Confronto valori... "<<flush;
Confronta(contenitore1, contenitore2);
clog<<"completato."<<endl;
}
template <typename TipoOggetto>
void Confronta(const char * File1, const char * File2)
{
ifstream file1, file2;
file1.open(File1);
if(!file1)
throw runtime_error("Impossibile aprire il primo file.");
file2.open(File2);
if(!file2)
throw runtime_error("Impossibile aprire il secondo file.");
Confronta< TipoOggetto >(file1, file2);
}
int main(int argc, char * argv[])
{
if(argc<3)
{
cerr<<"Argomenti insufficienti"<<endl;
return 1;
}
try
{
Confronta< RigaBase<int, 3> >(argv[1], argv[2]);
}
catch(exception & ex)
{
cerr<<"Catturata eccezione: "<<ex.what()<<endl;
return 2;
}
return 0;
}
Per utilizzarlo basta passargli i nomi dei due file sulla linea di comando.