W
K.A. schrieb:
ich muss eine Tabelle auslesen. in welchem Datentyp ist es günstig, eine solche Tabelle zu speichern...
Ich dachte an einen map<char,map<char,int> > doch komm ich damit momentan noch nicht klar!
am besten Du machst Dir eine eigene Klasse mit einer map<pair<char, char>, int> im Bauch, wie schon von Redhead vorgeschlagen.
Eine Klasse - ich nenne sie mal Tabelle - sollte einen istream-operator haben und vielleicht gleich eine Methode um einfach mit zwei Zeichen an die Werte der Tabelle ranzukommen.
#include <iostream>
#include <map>
class Tabelle
{
public:
Tabelle() : m_tab() {}
int& operator()( char c1, char c2 );
friend std::istream& operator>>( std::istream& in, Tabelle& tab_ );
private:
std::map< std::pair< char, char >, int > m_tab;
};
Die Implementierung sähe dann so aus
#include <iterator>
#include <string>
#include <sstream>
#include <vector>
int& Tabelle::operator()( char c1, char c2 )
{
return m_tab[ std::make_pair( c1, c2 ) ];
}
std::istream& operator>>( std::istream& in, Tabelle& tab_ )
{
Tabelle tab;
std::vector< char > lbl2; // Labels der Horizontalen (Kopfzeile)
{ // -- Kopfzeile einlesen
std::string zl1str;
if( !std::getline( in, zl1str ) )
return in;
std::stringstream zl1( zl1str );
std::copy( std::istream_iterator< char >( zl1 ), std::istream_iterator< char >(),
std::back_inserter( lbl2 ) );
}
for( int zl=0; zl<lbl2.size(); ++zl )
{
char lbl1;
if( (in >> lbl1).fail() ) // ersten Buchstaben der Zeile lesen
return in;
for( int sp=0; sp<lbl2.size(); ++sp )
{
int zahl;
if( (in >> zahl).fail() ) // Zahl in der Tabelle einlesen ..
return in;
tab.m_tab.insert( std::make_pair( // .. und speichern
std::make_pair( lbl1, lbl2[sp] ), // <- Key
zahl ) ); // <- Value
}
}
tab.m_tab.swap( tab_.m_tab ); // alles Ok, dann Tabelle übernehmen
return in;
}
und die Anwendung wird ganz einfach
#include <fstream>
#include <iostream>
int main()
{
using namespace std;
Tabelle tab;
ifstream file("input.txt");
if( file >> tab )
{
cout << "Zahl an Position(I,H) ist " << tab( 'I', 'H' ) << endl;
cout << "Zahl an Position(N,G) ist " << tab( 'N', 'G' ) << endl;
}
return 0;
}
Gruß
Werner