int main(){ set<int, less<int> > s; set<int, less<int> >::iterator i; s.insert(4); s.insert(0); s.insert(-9); s.insert(7); s.insert(-2); s.insert(4); s.insert(2); cout << "The set contains the elements: "; for (i=s.cbegin(); i!=s.cend(); i++) cout << *i << ' '; cout << endl;}
map e set sono implementati in modo da riordinare gli elementi per un lookup rapido in fase di ricerca. Se vuoi gli elementi nell'ordine in cui li hai inseriti allora stai cercando una coda (Queue).Puoi usare ad esempio una linked list in cui inserisci in testa (push_front) e cancelli in coda (back, pop_back).Se hai bisono sia della mappa che della lista ordinata, allora considera la possibilità di gestire simultaneamente le due strutture dati, incapsulandole in un container custom, oppure valuta se il tuo design non sia in qualche modo fallato in origine (sarebbe utile conoscere il contesto di utilizzo di tale struttura).
template< typename K, typename T >class MyContainer{public: MyContainer() { mHistoryCursor = mHistory.begin(); } T* put(K key, T value) { DictionaryType::iterator it = mDictionary.find(key); if (it == mDictionary.end() ) { T* tmp = &(mDictionary[key] = value); mHistory->push_front(tmp); return tmp; } return null; } // Versione non ordinata T* get(K key) const { DictionaryType::iterator it = mDictionary.find(key); if (it != mDictionary.end()) return (*it)->second; else return null; } // Versione ordinata T* getNext() { if (mHistoryCursor != mHistory.end()) { T* ret = *(++mHistoryCursor); return ret; } else return null; } void resetCursor() { mHistoryCursor = mHistory.begin(); }private: list< T* > mHistory; list< T* >::iterator mHistoryCursor; typedef hash_map< K, T > DictionaryType; DictionaryType mDictionary; };
map e set sono implementati in modo da riordinare gli elementi per un lookup rapido in fase di ricerca.
Citazione da: "clros"In ogni caso, una Queue, non credo si comporti come un set (nessuna duplicazione degli elementi inseriti)...Le STL del C++ non implementano l'unordered set? I cointaner di Ada offrono entrambe le implementazioni (che però si chiamano hashed e ordered). Anche Java mi pare offra l'alternativa.Però non credo che li inserisca come dici tu (ordinati dall'inserimento), semplicemente non ti garantisce l'ordine che dipende dal tipo di implementazione, quindi non dovresti fare alcuna supposizione sull'ordinamento. Il modo più elementare (e veloce) per implementare l'unordered set è l'hash table, più disordinato di così!
In ogni caso, una Queue, non credo si comporti come un set (nessuna duplicazione degli elementi inseriti)...
[...]Non so cosa passasse nella mente di Stroustrup per decidere diversamente, ma a mio avviso si è trattato di una scelta veramente stupida.
Boh. Penso che l'abbia comunque seguita. Ne era così contento nel '95 (se non ricordo male), quando la presentò a un seminario alla New York University (all'epoca ero lì in stage universitario ).
Vero, sembra che sia arrivata molto tardi al comitato (di cui faceva parte Stroustrup) e siano poi stati fatti dei cambiamenti.Boh. Magari la contentezza di Stroustrup era per il fatto che il C++ aveva una sua libreria standard.