Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
#1

std::map и перегрузка оператора - C++

13.07.2013, 16:07. Просмотров 1223. Ответов 4
Метки нет (Все метки)

решил освоить стандартные контейнеры и очередь за "map"
нахожу на http://en.cppreference.com/w/cpp/container/map замороченный код, сокращаю его, чтоб читалось, работает. Но как? Здесь по-видимому перегрузка << на на что? и как она реализована? с помощью шаблона...это меня застопорило...какие то Compare, Allocator

C++
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
#include <iostream>
#include <map>
 
// A specialization for Key strings
template<typename T, typename Compare, typename Allocator>
std::ostream& operator<<
(std::ostream& stream, const std::map<std::string, T, Compare, Allocator>& map)
 {stream << '{';
  char comma[3] = {'\0',' ', '\0'};
  for (const auto& pair : map)
  {stream << comma << '"' << pair.first << "\":" << pair.second;
   comma[0] = ',';
  }
  stream << '}';
  return stream;
}
 
int main()
{ typedef std::string Key;
  typedef int Mapped;
  // (1) Default constructor
  std::map<Key, Mapped> map;
  map["something"] = 69;
  map["anything"] = 199;
  map["that thing"] = 50;
  std::cout << std::string(80, '-') << std::endl;
  std::cout << "map = " << map << std::endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2013, 16:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::map и перегрузка оператора (C++):

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? - C++
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Emplace в std::map. Как добавить элемент в std::map без копирования? - C++
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...

std::map, std::vector и порядок обхода коллекции - C++
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Стоит ли очищать в деструкторе std::map , std::vecotor? - C++
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

Особенности std::map - C++
Добрый день форумчане, хотел спросить такую вещь, сейчас занимаюсь оптимизацией в графическом движке и возникла такая проблемма, хочу...

4
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
13.07.2013, 17:18 #2
Цитата Сообщение от soican Посмотреть сообщение
std::ostream& operator<<
(std::ostream& stream, const std::map<std::string, T, Compare, Allocator>& map)
перегрузка оператора вывода в поток, функция принимает ссылку на объект потока std::ostream& stream и саму map - const std::map<std::string, T, Compare, Allocator>& map

если уж изучаешь map должен знать, что данные помещаются по критерию сравнения - Compare, а в памяти располагаются классом Allocator
1
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
13.07.2013, 18:31  [ТС] #3
Key,T,Compare,Alloc вот стандартная четверка для map, но объявляем мы его просто
C++
1
std::map<Key, Mapped> map1;
я вот думаю - нафига шаблон для перегрузки?
C++
1
2
template<typename T, typename Compare, typename Allocator>
std::ostream& operator<<
получается только для того, чтобы иметь возможность составить эту функцию, которой нужны эти непонятные параметры,
C++
1
std::map<std::string, T, Compare, Allocator>
0
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
13.07.2013, 18:52 #4
soican, в принципе их можно и не указывать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <map>
 
 
std::ostream& operator<<(std::ostream& stream, const std::map<std::string, int>& map)
{
    std::map<std::string, int>::const_iterator it = map.begin();
    for(; it != map.end(); ++it)
        stream << (*it).first << " " << (*it).second;
    return stream;
}
 
int main()
{ typedef std::string Key;
    typedef int Mapped;
    // (1) Default constructor
    std::map<Key, Mapped> map;
    map["something"] = 69;
    map["anything"] = 199;
    map["that thing"] = 50;
    std::cout << std::string(80, '-') << std::endl;
    std::cout << "map = " << map << std::endl;
}
1
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
13.07.2013, 19:28  [ТС] #5
а ..получается запудрили мозги только своим правильным оформлением
0
13.07.2013, 19:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2013, 19:28
Привет! Вот еще темы с ответами:

allocator std::map - C++
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать и разъясните по-возможности, что это вообще такое...

Размерность std::map - C++
Добрый вечер. Использую тип данных 16 байтовый. Надо записать несколько десятков миллионов расчетов в map &lt;type, type&gt; val; C...

Std::map и key_comp - C++
Есть задача, нужно задать в map класс для сравнения ключей, но классу для сравнения нужен ещё один вспомогательный елемент. Ну вот...

Std::map::emplace - C++
То ли я туплю/криво поставил компилятор, то ли это emplace синтаксис кривой, но... Как использовать emplace применительно к map со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru