CUtlMap: Difference between revisions
No edit summary  | 
				No edit summary  | 
				||
| Line 5: | Line 5: | ||
== Discrepancies ==  | == Discrepancies ==  | ||
In std::map, accessor functions will find an element <i>by key</i>. '''<code>CUtlMap</code>''''s accessor functions do not find a specific element by key, but rather by index.    | In std::map, accessor functions will find an element <i>by key</i>. '''<code>CUtlMap</code>''''s accessor functions do not find a specific element by key, but rather by index.    | ||
This means that the following code  | This means that the following code  | ||
| Line 34: | Line 35: | ||
=== Bounds related ===  | === Bounds related ===  | ||
; <code>Count()</code>  | ; <code>Count()</code>  | ||
: The total number of items in the map.  | : The total number of items in the map.  | ||
| Line 46: | Line 48: | ||
== Adding elements ==  | == Adding elements ==  | ||
; <code>Insert( const [[KeyType_t]] &key, const [[ElemType_t]] &insert )</code>  | ; <code>Insert( const [[KeyType_t]] &key, const [[ElemType_t]] &insert )</code>  | ||
: Inserts the element and key into the tail of the map.  | : Inserts the element and key into the tail of the map.  | ||
| Line 56: | Line 59: | ||
== Accessing Elements ==  | == Accessing Elements ==  | ||
You can use array-style or use a method for index access:  | You can use array-style or use a method for index access:  | ||
; <code>Element( [[IndexType_t]] i )</code>  | ; <code>Element( [[IndexType_t]] i )</code>  | ||
| Line 68: | Line 72: | ||
== Removing elements ==  | == Removing elements ==  | ||
You can remove elements at a given index, a given key, or all at once.  | You can remove elements at a given index, a given key, or all at once.  | ||
| Line 83: | Line 88: | ||
== Iteration ==    | == Iteration ==    | ||
; <code>FirstInorder()</code>  | ; <code>FirstInorder()</code>  | ||
; <code>NextInorder( [[IndexType_t]] i )</code>  | ; <code>NextInorder( [[IndexType_t]] i )</code>  | ||
| Line 89: | Line 95: | ||
== Other functions ==  | == Other functions ==  | ||
You can get the tree which the CUtlMap consists of using  | You can get the tree which the CUtlMap consists of using  | ||
; <code>AccessTree()</code>  | ; <code>AccessTree()</code>  | ||
Revision as of 03:15, 14 March 2016
CUtlMap is Source's equivalent of the C++ Map type. A map is essentially a dynamic length array where each element, or member, 
is mapped to a specific, unique key value. The code can be found in public/tier1/utlmap.h.
Discrepancies
In std::map, accessor functions will find an element by key. CUtlMap's accessor functions do not find a specific element by key, but rather by index. 
This means that the following code
// Initialize map for given type
CUtlMap<int, CBaseEntity*> mapList;
CBaseEntity* pOther;
// (Populate map here)
mapList.Insert(pOther->entindex(), CBaseEntity);
// Access map
mapList[ 3 ]->entindex();
mapList.Element( 3 )->entindex();
would return a pointer to a CBaseEntity at index position 3 of the map, instead of returning a pointer to the CBaseEntity that has key of 3.
In order to access the element at a specific key, use
CBaseEntity *pOther;
//Find the index of our key value
int idx = mapList.Find(pOther->entindex());
//Ensure that it is a valid index
if (mapList.IsValidIndex(idx))
{
    pOther = mapList.Element(idx);
}
Count()- The total number of items in the map.
 IsValidIndex( int i )- Checks if a node is valid and in the map.
 InvalidIndex( )- Returns an invalid index.
 EnsureCapacity( int num )- Makes sure we have enough memory allocated to store a requested number of elements.
 MaxElement()- Max "size" of the vector
 
Adding elements
Insert( const KeyType_t &key, const ElemType_t &insert )- Inserts the element and key into the tail of the map.
 InsertOrReplace( ( const KeyType_t &key, const ElemType_t &insert )- Inserts the element and key into the tail of the map, replacing the element if the key is the same as one that already exists
 Reinsert( const KeyType_t &key, IndexType_t i )- If you change the search key, this can be used to reinsert the element into the map.
 
SetDefLessFunc(exampleCUtlMap).Accessing Elements
You can use array-style or use a method for index access:
Element( IndexType_t i )operator[]( IndexType_t i )- Returns the element at index i
 
CUtlMap's accessor functions do not find a specific element by key, but rather, by index. Key( IndexType_t i )- Returns the key at index i
 Find( const KeyType_t &key )- Returns the index at the given key
 
Removing elements
You can remove elements at a given index, a given key, or all at once.
Single:
RemoveAt( IndexType_t i )- Removes the element at index i
 Remove( const KeyType %key )- Removes the element mapped to the given key
 
All:
RemoveAll( )Purge( )PurgeAndDeleteElements( )- Purges the list and calls delete on each element in it.
 
Iteration
FirstInorder()NextInorder( IndexType_t i )PrevInorder( IndexType_t i )LastInorder()
Other functions
You can get the tree which the CUtlMap consists of using
AccessTree()- Returns a 
CTree 
You can swap one CUtlMap for another with
Swap( CUtlMap< K, T, I > &that )- Self explanatory