Как вывести map c
Перейти к содержимому

Как вывести map c

Developing.ru

Пишу архиватор. С контейнирами только знакомлюсь. Всё получалось до тех пор пока не пришлось вывести map в котором находится символ типа char, и vector. По алгоритму Хаффмана моя программа строит дерево, каждому символу присваивает соответствующий код в зависимости от частоты появления этого символа. Вот собственно сам код:

#include #include #include #include #include using namespace std; class Node < public: int a; char c; Node *left, *right; Node ()<>; Node (Node *L, Node *R) < left = L; right = R; a=L->a+R->a; > >; struct MyCompare < bool operator()(Node* l, Node* r) const < return l->a < r->a; > >; vector code; map  table; map ::iterator itrCode; void BuildTable (Node *root) < if (root->left!=NULL) < code.push_back(0); BuildTable (root->left); > if (root->right!=NULL) < code.push_back(1); BuildTable (root->right); > if (root->c) < table[root->c]=code; > code.pop_back(); > void print (Node* root, unsigned k=0) < if (root!=NULL) < print (root->left, k+3); for (unsigned i=0; i if (root->c) cout a << " (" c << ") " << endl; else cout a right, k+3); > > int main() < string s="Waiting for the san"; map m; for (int i=0; i map ::iterator itr; list t; for (itr=m.begin(); itr!=m.end(); itr++) < //cout first << ":" second c=itr->first; p->a=itr->second; t.push_back(p); > while (t.size()!=1) < t.sort (MyCompare()); Node *SonL=t.front(); t.pop_front(); Node *SonR=t.front(); t.pop_front(); Node *parent = new Node(SonL, SonR); t.push_back(parent); >Node *root=t.front(); //unsigned k=0; //print (root, k); BuildTable (root); for (itrCode=table.begin(); itrCode!=table.end(); itrCode++) < cout first second; > >

Вот этот вывод который я пытался написать:

for (itrCode=table.begin(); itrCode!=table.end(); itrCode++) < cout first second; > 

Но ему это не нравится. Если просто писать

cout first;

то всё хорошо, как только пытаюсь второй элемент (вектор) вывести, тут он не хочет. Подскажите что не так я делаю. Уже всю голову сломал.

Romeo Сообщения: 3091 Зарегистрирован: 02 мар 2004, 17:25 Откуда: Крым, Севастополь Контактная информация:

У тебя second в мапе является вектором, а не build-in значением. Так что у stream’а нету соответствующего оператора <<, чтобы вывести его.

Выводить придётся руками:

for (itrCode=table.begin(); itrCode!=table.end(); itrCode++) < cout first & vec = itrCode->second; for (vector::iterator it = vec.begin(); it != vec.end(); ++it) < cout cout

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Вывод содержимого map

Вывод содержимого map
Есть класс BigInt - класс длинных чисел: class BigInt < int nmb; char sing; int.

Вывод содержимого map>
Необходимо реализовать серверную часть словарика синонимов, где внесение синонимов имеет формат.

Копирование содержимого контейнера map
Итак, есть контейнер map<string,fsElem *>, где fsElem - базовый класс, также есть наследуемый от.

Вывод контейнера map
Подскажите пожалуйста как вывести на экран значение карты. Программа такая: надо создать карту, где.

Эксперт С++

6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
шарпопочитатель
Регистрация: 31.01.2010
Сообщений: 1,035

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
//--------------------------------------------------------------------------- #include #include #include #include #include #pragma hdrstop #include using namespace std; //--------------------------------------------------------------------------- struct print_pair : std::unary_function std::pair Key, Val >, std::ostream& > { std::ostream& ost; print_pair(std::ostream& os) : ost(os) { } std::ostream& operator() (const std::pair Key, Val >& p) { return ost  first  <'\t'  second.first  <'\t'  second.second  <'\n'; } }; #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { string buf; mapstring,int> m; while (cin>>buf) m[buf]++; for_each (m.begin(), m.end(), print_pairstring, pairstring, unsigned>>(cout)); //system("pause"); return 0; } //---------------------------------------------------------------------------

Как вывести на экран все значения элементов лежащих по одному ключу в std::map?

Как вывести на экран все значения элементов лежащих по одному ключу в std::map? вот у меня есть контейнер std::map, в нем содержится:
merlok 89-09-23
merlok 66-66-66
merlok 12-34-56
задача вывести все номера по ключу surname, где surname это merlok

#include #include #include struct data < std::string number; std::string surname; >user; void add(std::map& surname_book, std::map& phone_book) < while (1) < std::cout > user.number; if (user.number == "0") < system("cls"); break; >std::cout > user.surname; phone_book.insert( std::pair(user.number, user.surname)); surname_book.insert( std::pair(user.number, user.surname)); > > void search_by_surname(std::map& surname_book) < std::string surname; std::cout > surname; std::map::iterator it = surname_book.begin(); if (it == surname_book.end()) < std::cout else < std::cout first > > void search_by_number(std::map& phone_book) < std::string number; std::cout > number; std::map::iterator it = phone_book.find(number); std::cout << "Founds:\n"; if (it == phone_book.end()) < std::cout else < std::cout first << " " second > int main() < std::mapsurnameBook; std::map phoneBook; while (1) < std::cout > choice; if (choice == "0") < system("cls"); break; >if (choice == "add") < add(surnameBook, phoneBook); >else if (choice == "find") < std::cout > ans; switch (ans) < case 1: search_by_number(phoneBook); break; case 2: search_by_surname(surnameBook); break; >system("pause"); system("cls"); > > std::cout
  • Вопрос задан более года назад
  • 387 просмотров

1 комментарий

Простой 1 комментарий

loganbaby

logan baby @loganbaby Автор вопроса
и сделать это за O(logN).
Решения вопроса 0
Ответы на вопрос 2

Rsa97

Для правильного вопроса надо знать половину ответа

ЕМНИП, у std:map не может быть нескольких элементов с одним ключом. Так что просто
surname_book.find(surname)

Ответ написан более года назад

loganbaby

logan baby @loganbaby Автор вопроса

я неверно поставил вопрос. взгляните на код, при вводе add надо ввести "номер телефона" и "фамилию". что то типо телефонной книги. я могу ввести также одинаковые фамилии на разные номера телефонов, но не одинаковые номера телефонов на разные фамилии. как их вывести за logN? с циклом (как у меня) получается за O(N), в этом и заключалась суть вопроса)))

#include #include #include struct data < std::string number; std::string surname; >user; void add(std::map& surname_book, std::map& phone_book) < while (1) < std::cout > user.number; if (user.number == "0") < system("cls"); break; >std::cout > user.surname; phone_book.insert( std::pair(user.number, user.surname)); surname_book.insert( std::pair(user.number, user.surname)); > > void search_by_surname(std::map& surname_book) < std::string surname; std::cout > surname; std::map::iterator it = surname_book.begin(); if (it == surname_book.end()) < std::cout else < std::cout first > > void search_by_number(std::map& phone_book) < std::string number; std::cout > number; std::map::iterator it = phone_book.find(number); std::cout << "Founds:\n"; if (it == phone_book.end()) < std::cout else < std::cout first << " " second > int main() < std::mapsurnameBook; std::map phoneBook; while (1) < std::cout > choice; if (choice == "0") < system("cls"); break; >if (choice == "add") < add(surnameBook, phoneBook); >else if (choice == "find") < std::cout > ans; switch (ans) < case 1: search_by_number(phoneBook); break; case 2: search_by_surname(surnameBook); break; >system("pause"); system("cls"); > > std::cout

Как вывести map c

Карта или std::map представляет контейнер, где каждое значение ассоциировано с определенным ключом. И по этому ключу можно получить элемент. Причем ключи могут иметь только уникальные значения. Примером такого контейнера может служить словарь, где каждому слову сопоставляется его перевод или объяснение. Поэтому такие структуры еще называют словарями.

Стандартная библиотека C++ предоставляет два типа словарей: std::map и std::unordered_map . Эти типы представляют шаблоны, которые типизируются двумя типами. Первый тип - Key задает тип для ключей, а второй тип - Value устанавливает тип для значений.

Тип std::map определен в заголовочном файле . Определение пустого словаря:

#include #include int main() < std::mapproducts; >

Здесь определен словарь products, который будет условно хранить цену товаров. Для ключей будет применяться тип std::string , а для значений - числа типа unsigned (условно в качестве ключа будет выступать название товара, а в качестве значения - его цена).

Обращение к элементам

Для обращения к элементам словаря - получения или изменения их значений, так же, как в массиве или векторе, применяется оператора индексирования [] . Только вместо целочисленных индексов можно использовать ключи любого типа в следующем виде:

map[ключ]=значение

#include #include int main() < std::mapproducts; // установка значений products["bread"] = 30; products["milk"] = 80; products["apple"] = 60; // получение значений std::cout

Здесь определен словарь products, в котором ключами служат строки, а значениями - числа типа unsigned. Поэтому для установки элемента в квадратные скобки передается ключ-строка, а присваивается значение-число:

products["bread"] = 30;

Будем считать, что ключ - название товара, а значение - цена товара. То есть в данном случае элементу с ключом "bread" присваивается значение 30. При этом не важно, что ранее создан пустой словарь, и в нем нет никакого элемента с ключом "bread" - если его нет, то он создается. Если же элемент с данным ключом уже есть, то меняется его значение.

Чтобы получить элемент по определенному ключу, используем тот же синтаксис. Например, поскольку значение элемента - число, то мы можем, обратившись по ключу, получить это число:

unsigned breadPrice = products["bread"];

В выше приведенной программе просто выводим значения элементов на консоль:

bread 30 milk 80 apple 60

Перебор элементов:

Для перебора элементов можно применять цикл for в стиле "for-each":

#include #include int main() < std::mapproducts; // установка значений products["bread"] = 30; products["milk"] = 80; products["apple"] = 60; for (const auto& [product, price] : products) std::cout

Рассмотрим определение цикла. Каждый элемент словаря фактически представляет объект типа std::pair , который хранит, как ключ, так и значение. В нашем случае это объект std::pair . И с помощью полей first и second данного объекта мы могли бы получить соответственно ключ и значение элемента:

for (const auto& element : products) std::cout  

Но начиная со стандарта С++17 также можно использовать другой синтаксис, который позволяет сразу разложить объект на отдельные части - ключ и значение:

for (const auto& [product, price] : products) std::cout  

В данном случае в product будет помещаться ключ, а в price - значение элемента словаря. В итоге при выполнении программы мы получим следующий консольный вывод:

apple 60 bread 30 milk 80

Обратите внимание, что элементы располагаются в словаре и соответственно выводятся на консоль по возрастанию ключей. Поскольку ключи представляют строки, то они сортируются в алфавитном порядке.

Инициализация элементов

Тот факт, что в словаре элементы представляют тип std::pair, позволяет инициализировать словарь объектами std::pair:

#include #include int main() < std::mapproducts < std::pair, std::pair, std::pair >; >

И даже можно сократить определение:

#include #include int main() < std::mapproducts < , , >; >

Удаление элементов

Как было показано выше, для добавления элемента в словарь достаточно просто установить для некоторого ключа какой-нибудь значение. Для удаления же элементов применяется функция erase() , в которую передается ключ удаляемого элемента:

#include #include int main() < std::mapproducts < , , >; products.erase("milk"); // удаляем элемент с ключом "milk" for (const auto& [product, price] : products) std::cout 

Размер словаря

Для получения количества элементов в словаре применяется функция size() . Также класс map имеет функцию empty() , которая возвращает true , если словарь пуст.

#include #include int main() < std::mapproducts < , , >; std::cout 

Проверка наличия элемента

Чтобы проверить, есть ли в словаре элемент с определенным ключом, применяются функции count() (возвращает 1, если элемент есть, и 0 - если отсутствует) и contains() (возвращает true, если элемент есть, и false - если отсутствует). В обе функции передается ключ элемента:

#include #include int main() < std::mapproducts < std::pair, std::pair, std::pair >; std::cout 

Неупорядоченные словари

Тип std::map определяет словарь, который упорядочиваниет все свои элементы - по умолчанию в порядке возрастания ключей. Если упорядоченность не нужна, можно применять ти std::unordered_map , который в целом предоставляет тот же самый функционал, только не упорядочивает элементы и определен в заголовочном файле

#include #include int main() < std::unordered_mapproducts < std::pair, std::pair, std::pair >; for (const auto& [product, price] : products) std::cout

apple 60 milk 80 bread 30

Итераторы

Стоит отметить, что итераторы типа std::map являеются константными, что не позволяет изменять значения элементов при переборе:

#include #include int main() < std::mapphoneBook < , , >; for(auto iter; iter != phoneBook.end(); iter++) < std::cout first << "\t" second // для получения итераторов также можно использовать функции cbegin и cend for(auto iter; iter != phoneBook.cend(); iter++) < std::cout first << "\t" second >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *