map


map

A map allows storing pairs. The first element is use as key to find the second elements. It is not possible to insert two or more values with the same key. In the example below, we store computer equipment, the name of the product and the number of products.
Un map permite almacenar par de datos. El primer elemento es usado como una llave para encontrar el segundo. No es posible insertar dos o más valores con la misma llave. En el ejemplo de abajo, nosotros almacenamos equipo de computadoras, el nombre del producto y el número de productos.

List the Content of a map

The following codes illustrates how to list the content of a map. Note that the subscript operator can be used to insert a new item or to update an existing item in the map.
El siguiente código ilustra cómo listar el contenido de un map. Note que el operador de sub-índice puede ser usado para inserta un nuevo artículo o para actualizar un artículo existente en el map.

Program.cpp
void Program::MyFunc()
{
     //_______________________________ 1. Create and fill map
     map<wstring, int> data;
     data[L"CD"] = 10;
     data[L"Mouse"] = 20;
     data[L"Hard drive"] = 129;
     //_______________________________ 2. Iterate
     map<wstring, int>::iterator p;
     wstring name;
     int count;
     for (p = data.begin(); p != data.end(); p++)
     {
           name = p->first;
          count = p->second;
     }
}


Tip
Because find and insert are slow operations, when inserting in a map use insert instead of using: find followed of an insert. See example below. Note that result.first returns an iterator pointing to either the newly inserted element or to the element that already had its same value in the map. The result.second element in the pair is set to true if a new element was inserted or false if an element with the same value existed in the map.
Debido a que find e insert son operaciones lentas, cuando inserte en un mapa use insert en lugar de usar: find seguido de un insert. Vea el ejemplo de abajo. Observe que result.first regresa un iterador apuntando ya sea al elemento nuevamente creado o al elemento existente que tenía el mismo valor en el mapa. El elemento result.second en el par es fijado a verdadero si un elemento nuevo fue insertado o falso si un elemento con el mismo valor existía en el map.

Program.cpp
void Program::MyFunc()
{
     map<wstring, int> data;
     pair<map<wstring, int>::iterator, bool > result;
     map<wstring, int>::iterator p;
     //______________________________________________________ Insert one value
     result = data.insert( pair<wstring, int>(L"Monitor", 133));
     if (result.second == true)
     {
          p = result.first; // p points to the new value
     }
     else
     {
          p = result.first; // p points to the found item
     }
}


Ignore Case

The following code declares a map that ignores the case of the keys in a map, therefore upper case and lower case characters in wstring are indistinctly treated.
El siguiente código declara un mapa que ignora si las letras son mayúsculas o minúsculas en la variable wstring.

Program.cpp
struct NoCaseLess_wchar_t : public std::binary_function<wchar_t, wchar_t, bool >
{
     bool operator () (wchar_t x, wchar_t y) const
     {
          return toupper(x) < toupper(y);
     }
};

struct MySortFunction: public std::binary_function<wstring, wstring, bool >
{
     bool operator () (const wstring& x, const wstring& y) const
     {
          return std::lexicographical_compare(x.begin(),x.end(), y.begin(),y.end(), NoCaseLess_wchar_t());
     }
};
map<wstring, double, MySortFunction> directory;


Tip
Wintempla defines NoCaseless in the class Sys::TextAssistant to ignore the case (uppercase characters) are equal to lower case characters) of the key in a map, see the code below.

Wintempla defines AccentCompare in the class Sys::TextAssistant to sort words with accents (i.e., résume) of the key in a map.
Wintempla define NoCaseLess en la clase Sys::TextAssistant para que no exista diferencia entre mayúsculas y minúsculas en la key (llave) de un mapa, vea el código de abajo.

Wintempla define AccentCompare en la clase Sys::TextAssistant ordenar palabras con acentos (por ejemplo: canción) en la key (llave) de un mapa.

Program.cpp
map<wstring, double, Sys::TextAssistant::NoCaseLess> directory;


unordered_map

The STL provides the unordered_map to improve insertion performance. A unordered_map does not sort its elements, instead it uses a hash. The example below shows how to declare a unordered_map that ignores characters case. In the same code the default template is shown.
La STL proporciona un unordered_map para mejorar el desempeño de las inserciones. Un unordered_map no ordena su elementos, en su lugar usa un hash. El ejemplo de abajo muestra como declarar un unordered_map que ignora entre mayúsculas y minúsculas. En el mismo código la plantilla de defecto es mostrada.

Program.cpp
unordered_map<wstring, wstring, std::hash<wstring>, Sys::TextAssistant::NoCaseLess, std::allocator<std::pair<const wstring, wstring> > > head;

// Default template
// unordered_map<wstring, wstring, std::hash<wstring>, std::equal_to<wstring>, std::allocator<std::pair<const wstring, wstring> > > head;


Find

The following code illustrates how to find in a map.
El siguiente código ilustra cómo encontrar en un mapa.

Program.cpp
void Program::MyFunc()
{
     //_______________________________ Create and fill map
     map<wstring, int> data;
     data[L"CD"] = 10;
     data[L"Mouse"] = 20;
     data[L"Hard drive"] = 129;

     //______________________________ Find
     map<wstring, int>::iterator p;
     wstring name;
     int count;
     p = data.find(L"Mouse");
     if (p != mapa.end())
     {
           name = p->first;
          count = p->second;
     }
     else
     {
          // Not found
     }
}


Erase

The following codes illustrate how to delete elements from a map. In the first code, it is possible to erase while iterating the content of the map. The second code illustrates how to delete one element from the container.
Los siguientes códigos ilustran cómo borrar elementos de un map. En el primer código, es posible borrar mientras se recorre el contenido del mapa. El segundo código ilustra como borrar un elemento del contenedor.

Program1.cpp
void Program1::MyFunc()
{
     //_______________________________ 1. Create and fill map
     map<wstring, int> data;
     data[L"CD"] = 10;
     data[L"Mouse"] = 20;
     data[L"Hard drive"] = 129;
     //______________________________ 2. Iterate and delete the Mouse
     map<wstring, int>::iterator p;
     wstring name;
     int count;
     for (p = data.begin(); p != mapa.end(); )
     {
           name = p->first.Get();
          if (name == L"Mouse")
          {
               p = map.erase(p); // DO NOT CALL p++
          }     
          else
          {
               p++;
          }
     }
}


Program2.cpp
void Program2::Window_Open(Win::Event& e)
{
     //_______________________________ 1. Create and fill map
     map<wstring, int> data;
     data[L"CD"] = 10;
     data[L"Mouse"] = 20;
     data[L"Hard drive"] = 129;
     //_______________________________ 2. Delete the Mouse
     data.erase(L"Mouse");
     //_______________________________ 3. Display
     wstring text;
     wstring tmp;
     map<wstring, int>::iterator p;
     for (p = data.begin(); p != data.end(); p++)
     {
          Sys::Format(tmp, L"%s %d\r\n", p->first.c_str(), p->second);
          text += tmp;
     }
     this->MessageBox(text, L"map", MB_OK);
}


map_erase

Problem 1
Cree a Dialog application using Wintempla called Occurrence to extract the words from a textbox and compute how many times these words are included in the text.
Cree una aplicación de Diálogo usando Wintempla llamada Occurrence para extraer las palabras de una caja de texto, y calcular cuantas veces estas palabras están incluidas en el texto.

OccurenceRun

Occurence.cpp
...
void Occurrence::Window_Open(Win::Event& e)
{
     //________________________________________________________ lvWords
     lvWords.Cols.Add(0, LVCFMT_LEFT, 120, L"Word");
     lvWords.Cols.Add(1, LVCFMT_RIGHT, 100, L"Count");
}

void Occurrence::tbxInput_Change(Win::Event& e)
{
     //_________________________________________________________ Extract the words
     wstring text = tbxInput.Text;
     map<wstring, int> dictionary;
     pair<map<wstring, int>::iterator, bool > result;
     const size_t len = text.size();
     wchar_t buffer[128];
     size_t i = 0, j = 0;
     for (i = 0; i < len; i++)
     {
          if (Sys::TextAssistant::IsSeparator(text[i]) == true)
          {
               //_________________________ insert word
               buffer[j] = '\0';
               if (wcslen(buffer) != 0)
               {
                    result = dictionary.insert(pair<wstring, int>(buffer, 1));
                    if (result.second == true)
                    {
                         // New word was inserted
                    }
                    else
                    {
                         // An existing word was found
                         result.first->second = result.first->second + 1;
                    }

               }
               j = 0;
          }
          else
          {
               //________________________ keep copying word
               buffer[j++] = text[i];
          }
     }
     //___________________________________________________________ Show the words
     lvWords.Items.DeleteAll(); //Remove previous words
     lvWords.SetRedraw(false); //Improve performance, by preventing the list view control from re-drawing
     map<wstring, int>::const_iterator last = dictionary.end();
     map<wstring, int>::iterator p;
     for (i = 0, p = dictionary.begin(); p != last; p++, i++)
     {
          lvWords.Items.Add(i, p->first);
          lvWords.Items[i][1].Text = Sys::Convert::ToString(p->second);
     }
     lvWords.SetRedraw(true); // Restore list view to normal re-drawing
}


Insert or Update

The operator[] can be used to insert an item to the map or to update and existing item as shown in the following example.
El operator[] puede ser usado para insertar un artículo en el mapa o actualizar un artículo existente como se muestra en el siguiente ejemplo.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     customControlCol.BorderSelection = true;
     customControlRow.BorderSelection = true;
     //customControlTable.BorderSelection = true;
     customControlTable.HasHeader = true;
     customControlTable.SelectFullRow = true;

     //_______________________________ 1. Create and fill map
     map<wstring, int> data;
     data[L"CD"] = 10;
     data[L"Mouse"] = 20;
     data[L"Hard drive"] = 129;
     //_______________________________ 2. Update
     data[L"Mouse"] = 11;
     //_______________________________ 3. Display
     wstring text;
     wstring tmp;
     map<wstring, int>::iterator p;
     for (p = data.begin(); p != data.end(); p++)
     {
          Sys::Format(tmp, L"%s %d\r\n", p->first.c_str(), p->second);
          text += tmp;
     }
     this->MessageBox(text, L"map", MB_OK);
}


map_update

© Copyright 2000-2021 Wintempla selo. All Rights Reserved. Jul 22 2021. Home