Главная > Программирование > c++ > С++. Урок 10. Изучаем map (ассоциативный массив).

С++. Урок 10. Изучаем map (ассоциативный массив).

18.01.2010. c++, Программирование

3

В реальной жизни вы редко ассоциируете какие-то данные с цифрами, а обычно используете для этого слова, звуки, картинки и т.д.  В с++, на данный момент, вы не умеете так делать. Настала пора научиться

В с++ существует отличный контейнер map, который позволяет вам ассоциировать элементы с чем угодно. Например, у вас есть список продуктов для покупки (список книг в библиотеке). Вам необходимо хранить сколько  и чего нужно купить (название и количество книг в библиотеке). Контейнер <map> позволяет нам хранить эти данные в виде ключ-значение (книга-количество, продукт-вес\объем...). Контейнер <map> является отсортированным массивом. Сортировка произведена по ключу.

Для использования <map> вам необходимо сначала его подключить:

#include <map>

Для создание контейнера достаточно написать:

map <key type,data type> map_name;

Для доступа (или записи) в массив нужно писать:

map_name[key];

Контейнер map также имеет возможность работы с итераторами. Поэтому вы можете использовать с ним множество различных алгоритмов.

Кроме этого, в данном контейнере существуют еще и специальные функции:

Про работы с итераторами:

Для обращения к элементу в строках и векторах достаточно было перед именем контейнера поставить *, но в map так не получится, т.к. в каждом элементе хранится 2 значения (ключ и данные). Поэтому надо писать так:

(*iter).first - для обращения к ключу и

(*iter).second -для обращения к данным,

где iter - итератор элемента

Кроме контейнера map существует контейнер multimap. Его отличие в том, что мы можем одному ключу задать несколько соответствий. Например, автору сопоставить несколько написанных им книг.

Примеры:

Программы для подсчета количества слов в тексте и вывод частоты их встречи в процентном соотношении (подсчет частоты встречи слов в тексте в процентах)

#include <iostream>
#include <string>
#include <map>
#include <fstream>

using namespace std;

int main()
{

map <string,int> words;
ifstream in;
in.open("in.txt");
string word;
while (in>>word)
words[word]++;
ofstream out;
out.open("out.txt");
int count=0;
map <string,int>::iterator cur;
out<<"Words count:"<<endl;
for (cur=words.begin();cur!=words.end();cur++)
{out<<(*cur).first<<": "<<(*cur).second<<endl;count+=(*cur).second;}
out<<"Words percenc:"<<endl;

for (cur=words.begin();cur!=words.end();cur++)
out<<(*cur).first<<": "<<(float)((float)(*cur).second/(float)count)*100<<"%"<<endl;

return 0;
}

Программа для создания словаря для брута (и не только).

#include <iostream>
#include <string>
#include <map>
#include <fstream>

using namespace std;

int main()
{

map  words;
ifstream in;
in.open("in.txt");
string word;
while (in>>word)
words[word]++;
ofstream out;
out.open("out.txt");
for (map ::iterator  it=words.begin();it!=words.end();it++)
out<<(*it).first<<";"<<endl;
cout<<"Done"<<endl;
return 0;
}

Программа подсчета частоты встречи слов в тексте может быть полезна для расшифровки  текста. (Некоторые алгоритмы для шифровки используют замену букв каким-то образом)

Вторая программа, создающая словарь для брута, работает очень просто. Она берет текст и вытаскивает из него все слова;)

Это были простейшие, но при этом рабочие примеры работы с ассоциативным массивом


Метки:

Rambler's Top100 Блогун - монетизируем блоги