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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Вывод map через ostream_iterator<> - C++

24.10.2012, 21:05. Просмотров 1165. Ответов 15
Метки нет (Все метки)

Не могу понять, оператор вывода для pair перегрузил, а код не компилируется. Как правильно сделать? Вот небольшой пример:
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 <sstream>
#include <algorithm>
#include <map>
std::ostream & operator<<(std::ostream & os, const std::pair<char, size_t> & p)
{
    os<<p.first;
    return os;
}
 
int main()
{
    using std::cout; using std::endl;
    std::stringstream ss("qwerty");
    std::map<char, size_t> mapOfChars;
    char ch;
    while (ss.get(ch))
        mapOfChars[ch]++;
    std::copy(mapOfChars.cbegin(), mapOfChars.cend(), std::ostream_iterator<std::pair<char, size_t> >(cout, " "));
    cout<<endl;
    system("pause");
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2012, 21:05     Вывод map через ostream_iterator<>
Посмотрите здесь:

Вывод map через ostream_iterator с использованием алгоритма reverse_copy!!! - C++
У меня есть два класса Time и Patient, я засунул их в map (ключ Time, значение - Patient), и мне надо вывести через ostream_iterator в...

Вывод содержимого map - C++
#include &lt;vcl.h&gt; #include &lt;string&gt; #include &lt;map&gt; #include &lt;iostream&gt; #pragma hdrstop #include &lt;tchar.h&gt; using namespace...

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

Вывод содержимого map - C++
Есть класс BigInt - класс длинных чисел: class BigInt { int nmb; char sing; int size; void Reverse(); public:...

Сделать через map - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;vector&gt; using namespace std; int main() { ...

Map: обращение к значению (класс) через [] - C++
Всем добрый день. Подскажите пожалуйста почему в 14 строчке без пустого конструктора пример не компилится ? Ведь я обращаюсь к объекту...

Ostream_iterator - C++
не умею пользоваться ostream_iterator,кто подскажет что я должен поставить вместо ??? map&lt;string, int&gt;city = { {&quot;Berlin&quot;,0}, ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.10.2012, 21:07     Вывод map через ostream_iterator<> #2
Засуньте оператор в пространство имен std.
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.10.2012, 21:18  [ТС]     Вывод map через ostream_iterator<> #3
Цитата Сообщение от diagon Посмотреть сообщение
Засуньте оператор в пространство имен std
Не понял, он и так в std.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
24.10.2012, 21:21     Вывод map через ostream_iterator<> #4
Когда компилятор ищет нужную функцию, он пользуется т.н. ADL (Argument - Dependent Lookup - поиск с учетом аргуменов). Суть его заключается в следующем - функция ищется в том пространстве имен, к которому относятся ее аргументы. Если бы ADL не существовало, то вместо :
C++
1
2
std::string s;
std::cout << s << std::endl;
нам приходилось бы писать такие чудовищные конструкции:
C++
1
std::operator << (std::operator << (std::cout, s), std::endl);
но этого делать не приходиться, поскольку cout, string и endl находятся в пространстве имен std, то функция operator<< ищется там же.

Цитата Сообщение от yuron_477 Посмотреть сообщение
Не понял, он и так в std.
С чего это?
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.10.2012, 21:56  [ТС]     Вывод map через ostream_iterator<> #5
Да, как то я этот момент опустил, впервые просто с таким столкнулся. Переделал на такое и заработало:
C++
1
2
3
4
5
6
7
8
namespace std
{
    ostream & operator <<(ostream & os, const pair<char, size_t> & p)
    {
        os<<p.first;
        return os;
    }
}
Спасибо за подсказку.
Jupiter
24.10.2012, 22:07
  #6

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Когда компилятор ищет нужную функцию, он пользуется т.н. ADL
если б все так было просто( ЕМНИП там целый свод правил когда применяется ADL, а когда обычный поиск

gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
25.10.2012, 00:18     Вывод map через ostream_iterator<> #7
yuron_477, вообще добавлять что-либо в std запрещено, на сколько я помню.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
25.10.2012, 09:06     Вывод map через ostream_iterator<> #8

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
если б все так было просто( ЕМНИП там целый свод правил когда применяется ADL, а когда обычный поиск
Значит надо было написать - "Когда компилятор ищет нужную функцию, иногда он пользуется т.н. ADL"



Цитата Сообщение от gray_fox Посмотреть сообщение
yuron_477, вообще добавлять что-либо в std запрещено, на сколько я помню.
Просто не рекомендуется, но не запрещено. Но в данном случае это единственный вариант решения проблемы.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.10.2012, 09:12     Вывод map через ostream_iterator<> #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Kastaneda, В корне неверно. Инъекции в namespace std ведут к неопределенному поведению программы.

17.6.4.2.1/1

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a
namespace within namespace std unless otherwise specified. A program may add a template specialization
for any standard library template to namespace std only if the declaration depends on a user-defined type
and the specialization meets the standard library requirements for the original template and is not explicitly
prohibited.181
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
25.10.2012, 09:31     Вывод map через ostream_iterator<> #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, В корне неверно.
Что именно не верно? Я ж говорю, что не рекомендуется. Про UB я честно говоря не знал, но все же и так понятно, что в std:: лезть не надо.

Или ты про это?
Цитата Сообщение от Kastaneda Посмотреть сообщение
Но в данном случае это единственный вариант решения проблемы.
Это я прочитал в "Философия С++", автор Эккель, хороший автор.
Может в С++03 UB не было?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.10.2012, 09:39     Вывод map через ostream_iterator<> #11
Kastaneda, Было. Не стоит использовать copy с std::map, ибо у пары нет оператора вывода. Есть несколько вариантов обхода и из них оператор вывода в поток в пространстве имен стд - самый плохой.
Kastaneda
25.10.2012, 09:42
  #12

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, Было
Ну тогда странно, что автор не упомянул об этом в своей книге. Ладно, теперь буду знать

ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.10.2012, 09:46     Вывод map через ostream_iterator<> #13
К слову о нескольких вариантах вывода

http://stackoverflow.com/questions/6...ut-for-stdpair
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
25.10.2012, 10:11     Вывод map через ostream_iterator<> #14
Выводов до можно сколько угодно написать, идея была сделать, чтоб так работало:
C++
1
2
std::pair<someType1, someType2> p;
std::cout << p;
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.10.2012, 10:30     Вывод map через ostream_iterator<> #15
Kastaneda, Это-то будет работать и без инъекций в std.) Не будет работать непосредственно std::copy. А для этого самый нормальный вариант - враппер над парой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 10:34     Вывод map через ostream_iterator<>
Еще ссылки по теме:

ostream_iterator - C++
Имеется массив объектов string - result и текстовой файл. При выводе на экран с помощью ostream_iterator&lt;string,char&gt;out(cout,&quot;\n&quot;) ...

Переделать программу что бы была через map - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;vector&gt; using namespace std; int main() { ...

STL и ostream_iterator - C++
Здравствуйте, товарищи! Вопрос к знатокам библиотеки STL. Решая одну задачу в которой надо было посчитать некоторые точки, каждая из...

Как через map вывести объект определенного класса? - C++
Как через map вывести объект определенного класса? TwoHandedSwords vivod; int key = rand()%4 + 1; map&lt;int,TwoHandedSwords&gt;Rend...

Ostream_iterator - в чем ошибка? - C++
Пишу код (один в один с книги), но выдает ошибку в 14 строке, а именно (std::cout, &quot;. &quot;); Учебник: Лафоре, страница 720. Весь код: ...


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

Или воспользуйтесь поиском по форуму:
Kastaneda
25.10.2012, 10:34     Вывод map через ostream_iterator<>
  #16

Не по теме:

Ну да, чет тупанул

Yandex
Объявления
25.10.2012, 10:34     Вывод map через ostream_iterator<>
Ответ Создать тему
Опции темы

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