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;
}