ti posto il codice (c'è un po' di roba commentata che devo pulire usata per fare qualche prova):
il .h
codice:
/*
* KnowledgeBase.h
*
* Created on: Dec 24, 2009
* Author: ivan
*/
#ifndef KNOWLEDGEBASE_H_
#define KNOWLEDGEBASE_H_
#include <vector>
#include <map>
#include <set>
#include <string>
using namespace std;
class KnowledgeBase
{
public:
KnowledgeBase();
KnowledgeBase(const char* kbFileName);
~KnowledgeBase();
void setFileName(const char* kbFileName);
void addObjectDescription(string utterance);
void showUserDescription();
private:
//< mela, <[rossa, ruvida], [verde]> >
map <string, vector< vector<string> > > userDescription;
char* kbFilename;
void tokenize_string(string utt, vector<string>& words);
void showStringVector(vector <string> strVec);
};
#endif /* KNOWLEDGEBASE_H_ */
il .cpp
codice:
#include "KnowledgeBase.h"
#include <string.h>
KnowledgeBase::KnowledgeBase()
{
}
KnowledgeBase::KnowledgeBase(const char* kbFileName)
{
strcpy(kbFilename, kbFileName);
/*
ofstream f2;
f2.open("KnowledgeBase.txt", ios::trunc);
if (!f2)
{
return 0;
}
for (int k=0; k<10; k++)
{
f2<<names[k]<<endl;
f2<<points[k]<<endl;
}
f2.close();
*/
}
KnowledgeBase::~KnowledgeBase()
{
}
void KnowledgeBase::setFileName(const char* kbFileName)
{
strcpy(kbFilename, kbFileName);
}
void KnowledgeBase::tokenize_string(string utt, vector<string>& words)
{
char *a = new char[utt.size()+1];
strcpy (a, utt.c_str());
char* toka = strtok(a," ");
while(toka != NULL)
{
words.push_back(string().assign(toka));
toka = strtok(NULL," ");
}
}
void KnowledgeBase::showStringVector(vector <string> strVec)
{
cout<<"( ";
for(vector<string>::iterator i = strVec.begin(); i != strVec.end()-1; i++)
{
cout<<*i<<", ";
}
cout<<*(strVec.end()-1)<<" )";
}
void KnowledgeBase::showUserDescription()
{
// cout<<((userDescription.begin())->first)<<endl;
if (userDescription.empty())
{
cout<<"doh!"<<endl;
}
cout<<"aaaaaaaaaaa "<<endl;
//userDescription.
for (map <string, vector< vector<string> > > :: iterator walkerMap = userDescription.begin(); walkerMap != userDescription.end(); walkerMap++)
{
cout<<"object <"<<walkerMap->first<<"> : ( ";
for (vector< vector<string> > :: iterator walkerVec = walkerMap->second.begin(); walkerVec != walkerMap->second.end()-1; ++walkerVec )
{
showStringVector(*walkerVec);
cout<<", ";
}
showStringVector(*(walkerMap->second.end()-1));
cout<<" )"<<endl;
}
cout<<endl;
}
void KnowledgeBase::addObjectDescription(string utterance)
{
vector<string> words;
tokenize_string(utterance, words);
string itemIndex;
itemIndex = *(words.end()-1);
words.pop_back();
/*
for(vector<string>::iterator i = words.begin(); i != words.end(); i++)
{
cout<<*i<<endl;
//if the word is grounded write it
}
*/
//cout<<*(words.end()-1)<<endl;
//cout<<"asd : "<<itemIndex<<endl;
userDescription[itemIndex].push_back(words);
// cout<<((userDescription.begin())->first)<<endl;
//showUserDescription();
/*
for (map <string, vector< vector<string> > > :: iterator walkerMap = userDescription.begin(); walkerMap != userDescription.end(); walkerMap++)
{
cout<<"object <"<<walkerMap->first<<"> : ";
for (vector< vector<string> > :: iterator walkerVec = walkerMap->second.begin(); walkerVec != walkerMap->second.end(); ++walkerVec )
{
showStringVector(*walkerVec);
}
}
cout<<endl<<endl;
*/
}
beh nel main ci dovrebbe essere (se non scordo di includere qualcosa) qualcosa come:
#include <string>
#include "KnowledgeBase.h"
int main()
{
KnowledgeBase kbase("KnowledgeBase.txt");
char t_utt[50];
strcpy(t_utt,"ciao a tutti");
kbase.addObjectDescription(string().assign(t_utt)) ;
strcpy(t_utt,"bau a tutti");
kbase.addObjectDescription(string().assign(t_utt)) ;
strcpy(t_utt,"miau a qualcuno");
kbase.addObjectDescription(string().assign(t_utt)) ;
kbase.showUserDescription();
return 0;
}