понедельник, 13 июня 2011 г.

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

В реальной жизни вы редко ассоциируете какие-то данные с цифрами, а обычно используете для этого слова, звуки, картинки и т.д.  В с++, на данный момент, вы не умеете так делать. Настала пора научиться
В с++ существует отличный контейнер map, который позволяет вам ассоциировать элементы с чем угодно. Например, у вас есть список продуктов для покупки (список книг в библиотеке). Вам необходимо хранить сколько  и чего нужно купить (название и количество книг в библиотеке). Контейнер <map> позволяет нам хранить эти данные в виде ключ-значение (книга-количество, продукт-вес\объем...). Контейнер <map> является отсортированным массивом. Сортировка произведена по ключу.
Для использования <map> вам необходимо сначала его подключить:
#include <map>
Для создание контейнера достаточно написать:
map <key type,data type> map_name;
Для доступа (или записи) в массив нужно писать:
map_name[key];
Контейнер map также имеет возможность работы с итераторами. Поэтому вы можете использовать с ним множество различных алгоритмов.
Кроме этого, в данном контейнере существуют еще и специальные функции:
  • begin() - итератор на первый элемент
  • end() - итератор на элемент за последним
  • empty() - true, если контейнер пуст
  • count(key) - число элементов с заданным ключом (в map 1 или 0)
  • find(key) - итератор на элемент с указанным ключом
  • erase(it), erase(start,end) - удаляет элемент с заданным итератором или между заданными
  • size() - число элементов
  • clear() - полная очистка контейнера
Про работы с итераторами:
Для обращения к элементу в строках и векторах достаточно было перед именем контейнера поставить *, но в 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;
}
Программа подсчета частоты встречи слов в тексте может быть полезна для расшифровки  текста. (Некоторые алгоритмы для шифровки используют замену букв каким-то образом)
Вторая программа, создающая словарь для брута, работает очень просто. Она берет текст и вытаскивает из него все слова;)

Комментариев нет:

Отправить комментарий