| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Подсчёт каждого символа в заданной строке. |
| Автор: ANT1 11.6.2010, 13:24 | ||||
| Пожалуйста помогите. Задание: Подсчитать сколько раз встречается каждый символ в заданной строке, представленной в виде последовательности символов. Также: нельзя использовать циклы, а нужно использовать алгоритмы стандартной библиотеки. Вот, что написал я. Но здесь подсчёт введённого с клавиатуры символа, а мне именно нужно подсчитать кол-во каждого символа в строке.
Добавлено @ 13:25 Скорей всего здесь понадобится ассоциативный массив. Модератор: не забываем пользоваться кнопочкой "Код" |
| Автор: bsa 11.6.2010, 13:49 |
| я бы решал через массив счетчиков. Где индексом массива служил бы код символа. Это самое быстро работающее решение. Но за это надо платить памятью. Можно через std::map - памяти будет кушаться меньше (для малого набора разных символов), но скорость доступа уже будет не константной, а логарифмической... |
| Автор: ANT1 11.6.2010, 13:53 |
| А можете привести реализацию через контейнер: ассоц-й массив? А то у меня не получается. |
| Автор: bsa 11.6.2010, 14:11 | ||
Как-то так:
|
| Автор: ANT1 11.6.2010, 14:23 |
| Что-то сложновато написано. А можно произвести доработку по моему примеру? Например оставить полностью класс шаблон и функцию ввода. Скопировать из контей-ра список в контейнер ассоц-й массив. Потом произвести обработку( изменить ф-ии: обработки и вывода ). Добавлено через 2 минуты и 18 секунд И если возможно, то с комментариями, был бы очень благодарен. |
| Автор: bsa 11.6.2010, 16:06 |
| СЛОЖНО?!? куда уж проще! IncCounter - функтор, который увеличивает счетчик соответствующий символу. И ТОЛЬКО! PrintCounter - функтор, который выводит элемент ассоциативного контейнера в поток. И ТОЛЬКО! содержимое main() должно быть понятно без комментариев. |
| Автор: ANT1 11.6.2010, 16:18 | ||
Мне ваш код непонятен вообще. откуда тип struct? откуда секция public, если нет класса? Можете переделать именно мой вариант, т.к. ваш я не могу понять? |
| Автор: bsa 11.6.2010, 16:36 |
| причем тут public? у меня в коде этого нет. struct от class отличается только тем, что struct по умолчанию public, а класс - private. Мой код от твоего отличается использованием STL. Раз не понимаешь этот код, значит ты не знаешь язык. А лезть в шаблоны не зная основ языка - глупо. |
| Автор: ANT1 11.6.2010, 16:43 |
| т.е. можно написать 2 класса, вместо структур? Может всё-таки сделаете построчные комментарии? |
| Автор: bsa 11.6.2010, 17:19 | ||
|
| Автор: ANT1 11.6.2010, 17:44 | ||
| Большое спасибо. Запустил, работает. Только захотел строку вручную вводить, уже после пробела почему-то не считает.
Можете объяснить, как осуществляется поиск? И что это такое: explicit? Модератор: не забываем пользоваться кнопочкой "Код" |
| Автор: bsa 11.6.2010, 18:24 |
| читаем внимательно документацию на потоковый ввод. Там черным по белому написано, что оператор >> читает только СЛОВО (т.е. то, что между пробельными символами)! Если тебе надо читать строку, используй getline, описание - в документации. Какой поиск?!? Если ты про ассоциативный контейнер, то "поиск" зашит в него. Строчка 14 моего кода (++ccm_[c]). Читаем документацию на map explicit - это запрет компилятору преобразования {Class x = y} в {Class x(y)}. |
| Автор: ANT1 11.6.2010, 21:29 | ||||
Уважаемый bsa вот я переделал немного ваш код, и разбил его на загол. файл и файл реализацию:
//value_type
Вы не могли бы мне объяснить пошагово работу программы в выделенных строчках? Именно глубоко, а то я её не допонимаю. Я бы был вам очень благодарен.И ещё как можно доработать функтор увеличения счётчика до класса шаблона? Модератор: СКОЛЬКО РАЗ МОЖНО УЖЕ ПОВТОРЯТЬ ПРО КНОПКУ "КОД"?!? |
| Автор: bsa 11.6.2010, 22:52 | ||
Извини, я не могу тебе объяснить азы языка. У меня на это нет времени. Купи книжку.
про for_each написано тут: http://www.cplusplus.com/reference/algorithm/for_each/ |
| Автор: ANT1 11.6.2010, 23:10 |
| Тогда скажите для чего нужно: value_type,typedef. Как происходит именно подсчёт одинаковых символов? Почему мы в качестве счётчика устанавливает size_t, а не конкретный тип данных при создании контейнера? А first и second итераторы на символы и счётчики( мы их используем при выводе)? Скажите пожалуйста. |
| Автор: bsa 14.6.2010, 22:42 |
| ANT1, может все-таки почитать документацию на STL? А то вопросы по основам этой библиотеки... typedef - нужен для того, чтобы потом все время не писать map<...> Container::value_type - тип данных, хранимых в контейнере типа Container Подсчет ссылок производится путем вызова метода "operator()" класса IncCounter, которому передается символ. size_t - максимальный целый тип, который вмещает в себя размер памяти в символах. Можешь использовать unsigned вместо него (на 32-х битных системах это одно и тоже). когда ты пишешь std::map<X,Y>::iterator i, то i->first - это ссылка на объект типа X (ключ), а i->second на объект типа Y (значение). |
| Автор: ANT1 17.6.2010, 07:21 |
| Ясно. Всё понял и разобрался. С Привлечением Страуструпа. Спасибо! |
| Автор: bsa 17.6.2010, 22:30 | ||
Почитай http://forum.vingrad.ru/forum/topic-269794/kw-faq-c++.html, особенно, раздел про книги.
|
| Автор: ANT1 17.6.2010, 23:01 |
| Как нам говорил преподаватель Страуструп одна из самых достоверных книг по С++, но чем-то нужно платить она слишком большая и довольно сложная. |