map (C++ container)

From Wikipedia, the free encyclopedia

C++ Standard Library
ios
iostream
iomanip
map
fstream
C Standard Library
cassert
cctype
cerrno
cfloat
cmath
cstdio
cstdlib
ctime

The class std::map<Key, Data, Compare, Alloc> is a standard C++ container. It is a sorted associative array, which is a data structure which acts like a dynamic one-dimensional array that associates values of one type with values of another type (the two types of values may be the same).[1] Specifically, this type of associative array maps objects of type Key to objects of type Data. Typically, the key value is used to identify the element and the data is some sort of value associated with this key. The types of key and data may differ, and the elements of the map are internally sorted from lowest to highest key value. Each key value is unique; if an object is inserted with an already existing key, the object already present in the map is not changed in any way.[2] A variation on the map, called the multimap, allows keys to be duplicated.

Iterators are not invalidated by insert and erase operations which don't remove the object to which the iterator points. The usual implementation is a self-balancing binary search tree (but any other data structure that respects the complexity constraints can be used, like a skip list).

Contents

[edit] Main Characteristics

  • Each element has a unique key
  • Each element is composed of a key and a mapped value
  • Elements follow a strict weak ordering[2]

[edit] Performance

  • Searching for an element takes O(log n) time
  • Inserting a new element takes O(log n) time plus the time to call malloc once
  • Incrementing/decrementing an iterator takes O(log n) time
  • Iterating through every element of a map takes O(n) time
  • Removing a single map element takes O(log n) time
  • Copying an entire map takes O(n log n) time.[3]

Maps are designed to be especially efficient in accessing its elements by their key, as opposed to sequence containers which are more efficient in accessing elements by their position (although maps are able to directly access elements with the operator[] ).[2]

[edit] Usage

The map is declared in this format:

map <key_type, value_type [, comparing_option [, memory_allocator] ] > map_name

The following code demonstrates how to use the map<string, int> to count occurrences of words. It uses the word as the key and the count as the value.

#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
int main()
{
    map<string, int> wordcounts;
    string s;
 
    while (cin >> s && s != "end")
        ++wordcounts[s];
 
    while (cin >> s && s != "end")
        cout << s << ' ' << wordcounts[s] << endl;
}

When executed, the user first types a series of words separated by spaces, and a word "end" to signify the end of input; then the user can input words to query how many times each word occurred in the previous series.

The above example also demonstrates that the operator [] inserts new objects (using the default constructor) in the map if there isn't one associated with the key. So integral types are zero-initialized, strings are initialized to empty strings, etc.

The following example illustrates inserting elements into a map using the insert function and searching for a key using a map iterator and the find function:

#include <iostream>
#include <map>
using namespace std;
 
int main()
{
        typedef map<char, int> mapType;
        mapType myMap;
 
        // insert elements using insert function
        myMap.insert(pair<char, int>('a', 1));
        myMap.insert(pair<char, int>('b', 2));
        myMap.insert(pair<char, int>('c', 3));
        myMap.insert(pair<char, int>('d', 4));
        myMap.insert(pair<char, int>('e', 5));
 
        // erase the first element using the erase function
        mapType::iterator iter = myMap.begin();
        myMap.erase(iter);
 
        // output the size of the map
        cout << "Size of myMap: " << myMap.size() << endl;
 
        cout << "Enter a key to search for: ";
        char c;
        cin >> c;
 
        // find will return an iterator to the matching element if it is found
        // or to the end of the map if the key is not found
        iter = myMap.find(c);
        if( iter != myMap.end() ) 
                cout << "Value is: " << iter->second << endl;
        else
                cout << "Key is not in myMap" << endl;
 
        // clear the entries in the map
        myMap.clear();
}

In the above example, five elements are entered using the insertion function, and then the first element is deleted. Then, the size of the map is output. Next, the user is prompted for a key to search for. Using the iterator, the find function searches for an element with the given key. If it finds the key, the program prints the element's value. If it does not find it, an iterator to the end of the map is returned and it outputs that the key could not be found. Finally all the elements in the tree are erased.

[edit] Iterators

Maps may use iterators to point to specific elements in the container. An iterator can access both the key and the mapped value of an element:[2]

map<Key,T>::iterator it; // declares a map iterator
(*it).first;             // the key value
it->first;               // the same key value 
(*it).second;            // the mapped value
it->second;              // the same mapped value
(*it);                   // the "element value", which is of type:  pair<const Key,T>

Below is an example of looping through a map to display all keys and values using iterators:

#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
int main()
{
    typedef map<string, int> mapType;
    mapType data;
 
    // let's declare some initial values to this map
    data["BobsScore"] = 10;
    data["MartysScore"] = 15;
    data["MehmetsScore"] = 34;
    data["RockysScore"] = 22;
 
    // Iterate over the map and print out all key/value pairs.
    // Using a const_iterator since we are not going to change the values.
    for(mapType::const_iterator it = data.begin(); it != data.end(); ++it)
    {
        cout << "Who(key = first): " << it->first;
        cout << " Score(value = second): " << it->second << endl;
    }
 
    return 0;
}

This will output the keys and values of the entire map.

[edit] Member functions

What follows is a list of the public member functions in the map library:[2]

Name Description
(constructor) Construct a map object
(destructor) Destroys map object
operator= Copy content of container
Iterators:
begin Return iterator to beginning of map
end Return iterator to end of map
rbegin Return reverse iterator to reverse beginning (end)
rend Return reverse iterator to reverse end (beginning)
Capacity:
empty Test whether map is empty or not
size Return container size of map
max_size Return maximum size of map
Element access:
operator[] Access element
Modifiers:
insert Insert element
erase Erase element
swap Swap contents
clear Clear contents
Observers:
key_comp Return key comparison object
value_comp Return value comparison object
Operations:
find Return iterator to element
count Count elements with a specific key
lower_bound Return iterator to the lower bound
upper_bound Return iterator to the upper bound
equal_range Return range of equal elements
Allocator:
get_allocator Return allocator

[edit] Member Types

What follows is a list of the member types of the map container:[2]

Member Type Definition
key_type Key
mapped_type T
value_type pair<const Key,T>
key_compare Compare
value_compare Nested class to compare elements
allocator_type Allocator
reference Allocator::reference
const_reference Allocator::const_reference
iterator Bidirectional iterator
const_iterator Constant bidirectional iterator
size_type Unsigned integral type (usually same as size_t)
difference_type Signed integral type (usually same as ptrdiff_t)
pointer Allocator::pointer
const_pointer Allocator::const_pointer
reverse_iterator reverse_iterator<iterator>
const_reverse_iterator reverse_iterator<const_iterator>

[edit] References

[edit] See also