Oltre alla comodità di cambiare contenitore, spesso con la STL se non usi typedef puoi arrivare ad avere dichiarazioni mostruose; con i typedef:
codice:
class INISection
{
    //Typedef for the internal map
    typedef std::map<std::_tcstring,std::_tcstring,CaseInsensitive_Less> ISmap;
    /* ... */
}

/* ... */
      
void MeasurementUnitsContainer::RemoveDataFromINI(INISection & IniSect)
{
	IniSect.Read();
	typedef std::list<INISection::ISmap::iterator> itList;
	itList toDelete;
	INISection::ISmap & im=IniSect.GetInternalMap();
	{
		std::_tcstring prefix(_T("MUItem"));
		INISection::ISmap::iterator it, end=im.end();
		for(it=im.begin();it!=end;it++)
		{
			if(it->first.compare(0,prefix.size(),prefix)==0)
				toDelete.push_back(it);
		}
	}
	{
		itList::const_iterator it, end=toDelete.end();
		for(it=toDelete.begin();it!=end;it++)
			im.erase(*it);
	}
	IniSect.Write();
}
Senza typedef:
codice:
void MeasurementUnitsContainer::RemoveDataFromINI(INISection & IniSect)
{
	IniSect.Read();
	std::list< std::map<std::_tcstring,std::_tcstring,CaseInsensitive_Less>::iterator > toDelete;
	std::map<std::_tcstring,std::_tcstring,CaseInsensitive_Less> & im=IniSect.GetInternalMap();
	{
		std::_tcstring prefix(_T("MUItem"));
		std::map<std::_tcstring,std::_tcstring,CaseInsensitive_Less>::iterator it, end=im.end();
		for(it=im.begin();it!=end;it++)
		{
			if(it->first.compare(0,prefix.size(),prefix)==0)
				toDelete.push_back(it);
		}
	}
	{
		std::list< std::map<std::_tcstring,std::_tcstring,CaseInsensitive_Less>::iterator >::const_iterator it, end=toDelete.end();
		for(it=toDelete.begin();it!=end;it++)
			im.erase(*it);
	}
	IniSect.Write();
}
Immagina poi senza typedef che gioia se dovessi cambiare il tipo di INISection::ISMap...