В с++ существует отличный контейнер 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;
}
Программа подсчета частоты встречи слов в тексте может быть полезна
для расшифровки текста. (Некоторые алгоритмы для шифровки используют
замену букв каким-то образом)Вторая программа, создающая словарь для брута, работает очень просто. Она берет текст и вытаскивает из него все слова;)
Комментариев нет:
Отправить комментарий