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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
slipp1
13 / 12 / 1
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
#1

templates, STL - C++

10.10.2013, 12:11. Просмотров 1498. Ответов 43
Метки нет (Все метки)

ПЕРВОЕ средства обобщенного программирования в С++ (templates)
ВТОРОЕ библиотека STL, контейнеры и алгоритмамы STL

в чем разница первого и второго?

спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2013, 12:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос templates, STL (C++):

Variadic templates - C++
как можно сделать чтобы функция принимала бесконечное количество объектов std::string? (только их) я пробовал вот так: template<const...

Variadic templates - C++
1. как можно сделать чтобы передавались ссылки на переменные? (с variadic templates) 2. как вообще обращаться к переменным объявленным...

Variadic templates - C++
А как бы так исхитриться, чтобы шаблонная функция, использующая Variadic templates узнала размер передаваемых ей параметров с тем, чтобы,...

Variadic Templates - C++
проблема только в переводе на русский, обычно это "Шаблоны с переменным числом аргументов" но такое длинное выражение долго не проживёт....

Generic inheritance. Templates - C++
Код компилируется. Не могу разобраться то ли я как не правильно иерархию построил то ли компилятор глючит. Вообщем если я пишу в...

Templates внутри класса - C++
Добрый день!! Я новичок в Си ++. Никак не могу разобраться в синтаксисе. Помогите пожалуйста, а если можете, подскажите как лучше исполнить...

43
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
10.10.2013, 22:28 #16
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Вообще, беспредметный разговор. Лично я понимаю, что инструмент мощный. Но. Опасный и неудобный.
ну да надо только применять там, где надо применять, тогда и проблем не будет. ИМХО перед тем как наследоваться от шаблона нужно очень хорошо подумать. а в остальном, как сказал страуступ, они выражают общность там, где её нельзя выразить другими средствами (ну как-то так она сказал).
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 22:41 #17
Общность можно выразить не только за счёт шаблонов. Но и за счёт наследования. И почти всегда лучше с помощью наследования показывать общность - это непосредственная общность, в отличии от потенциальной - шаблонов, к тому же более сильная.
К тому же, наследование проверяется и при компиляции и при исполнении. А шаблоны проверяются только при компиляции. Меньше возможностей в виду отстутствии рефлексии.
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
10.10.2013, 22:54 #18
Цитата Сообщение от AnyOne697 Посмотреть сообщение
И?.. user-defined value types? Вы
смеётесь. Класс - да, он похож на user-defined value types. А структура - банальный агрегатор данных. Впрочем, в Си++ что-то странное сотворили со структурами от чего они стали... Запутанными.
Вот именно что нет в Java "банального агрегатора данных". Ключевое отличие value types от reference types знаете? Попробуйте на Java реализовать эффективный тип данных для комплексных чисел с возможностью выбора базового типа хотя бы из float/double. Эффективный тип данных - это такой, при использовании которого не будет потерь производительности по сравнению с вручную написанным кодом под специальные случаи.
0
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
10.10.2013, 23:01 #19
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Общность можно выразить не только за счёт шаблонов. Но и за счёт наследования.
такая общность весьма разная. наследование (public) - Х есть (is) У. включения экземпляра другого класса в класс - X имеет (has) Y (вот не надо сейчас эту тему развивать ). а шаблон такие-то классы обрабатываются по одному и тому же шаблону (при этом они не is и не has).

когда нужно что-то выразить, то просто выбираешь нужно средство.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 23:06 #20
Намазал мыслию по древу..
А можно не писать эти талмуды а просто в 5 строках пояснить что имелось в виду в 12-м посте в ответ на вопрос Убежденного ?
0
XRuZzz
10.10.2013, 23:14
  #21

Не по теме:

если кто понял о чем говорил AnyOne697 пожалуйста переведите я честно прочитал его посты, но смысл почему не надо использовать шаблоны не понял.

0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,290
Завершенные тесты: 1
10.10.2013, 23:20 #22
Могу с полной уверенностью сказать: переход от чистого ОО к симбиозу ОО и обобщенного программирования дал мне просто огромный левел-ап. Я смог нормально читать и вникать в код буста. Это просто неиссякаемый кладезь полезной информации. Сравнимо с тем, что я всю жизнь сидел дома, а потом внезапно вышел на улицу - новые горизонты, новые и почти неограниченные возможности.

Как пафосно я завернул

В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста без призыва шаблонов и показать, насколько увеличилось удобство использования и производительность.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 23:23 #23
Цитата Сообщение от ct0r Посмотреть сообщение
В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста
Да хотя бы vector из STL.
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.10.2013, 23:30 #24
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Всё очень просто. Пришлось правда сделать Complex -> Real -> Integer -> Unsigned -> Object.
Ну и банальное:
C++
1
2
3
4
5
6
class List {
public:
 virtual void put ( Object o, uint i = 0 );
 virtual Object get ( uint i );
 /***/
}
а зачем нам ещё один objective-c ?

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
А можно не писать эти талмуды а просто в 5 строках пояснить что имелось в виду в 12-м посте в ответ на вопрос Убежденного ?
как я понял то товарищ AnyOne697 предлагает "взять все, да и поделить" унаследовать от Object

Не по теме:

совпадение с Шариковым случайно

1
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 23:32 #25
Цитата Сообщение от Jupiter Посмотреть сообщение
как я понял то товарищ AnyOne697 предлагает "взять все, да и поделить" унаследовать от Object
Ну тогда он скорее всего ошибся разделом..
0
Убежденный
Системный программист
Эксперт С++
15618 / 7127 / 1128
Регистрация: 02.05.2013
Сообщений: 11,567
Записей в блоге: 1
Завершенные тесты: 1
11.10.2013, 00:48 #26
Цитата Сообщение от AnyOne697 Посмотреть сообщение
virtual void put ( Object o, uint i = 0 );
И как в такой list вставить экземпляр типа int ? Например, put(123) не работает.
А указатель как вставить ? Завернуть его в структуру и унаследовать структуру
от Object ? Вообще, это не опечатка, что Object передается по значению ?
Если не опечатка, тогда как вообще выполняется получение реального типа ?

Ок, допустим это опечатка и Object передается по указателю/ссылке.
И сразу же встает вопрос управления временем жизни объекта.

В общем, этот пример неубедителен.
Простой std::list проще, нагляднее и скорее всего еще и эффективнее, в основном
за счет использования шаблонов.
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
11.10.2013, 00:53 #27
Цитата Сообщение от Убежденный Посмотреть сообщение
И как в такой list вставить экземпляр типа int ?
Это как в Яве (если без generics) - нужен враппер (Integer), а потом касты при извлечении из колекции...
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:21 #28
[quote="Убежденный;5166658"]И как в такой list вставить экземпляр типа int ? Например, put(123) не работает.[quote]
Легко.
C++
1
List list; list.put ( new Integer ( 123 ) );
Немного многословно, но мы сделали несколько облегчающих инструментов.
Алсо, иногда, когда скорость (ну или эллегантность кода, что в общем-то было в приоритете) очень и очень критична, делали такое:
C++
1
2
3
4
5
class IntList {
public:
    virtual void put ( int v, int i = 0 );
    virtual int get ( int i );
}
Цитата Сообщение от Убежденный Посмотреть сообщение
А указатель как вставить ? Завернуть его в структуру и унаследовать структуру
от Object ? Вообще, это не опечатка, что Object передается по значению ?
Если не опечатка, тогда как вообще выполняется получение реального типа ?
Не совсем. Это и не опечатка и опечатка. Мы сделали умные указатели внутри Object по типу конверта. Приходилось по особому делать копирующие конструкторы и вообще аккуратно работать с памятью, но в общем и целом, стало даже проще, чем если без этого =)

Вообще, мы хотели ещё попробовать добавить немного рефлексии, но как-то слабо получалось. Не удобно очень. Или макросы страшные появлялсиь, или какие-то списки приходилось создавать. Но с ней всё было бы много круче.
Цитата Сообщение от castaway Посмотреть сообщение
Ну тогда он скорее всего ошибся разделом..
Ну я смотрю, что иницировал здесь неплохую дискуссию.
Цитата Сообщение от ct0r Посмотреть сообщение
Могу с полной уверенностью сказать: переход от чистого ОО к симбиозу ОО и обобщенного программирования дал мне просто огромный левел-ап. Я смог нормально читать и вникать в код буста. Это просто неиссякаемый кладезь полезной информации. Сравнимо с тем, что я всю жизнь сидел дома, а потом внезапно вышел на улицу - новые горизонты, новые и почти неограниченные возможности.
Я читал код буста. И честно - потом долго отходил. Да, там интересно реализованы некоторые вещи. Но при этом понимаешь, что нужно слишком круто владеть таким инструментом, как Си++. Да и ногу лишний раз прострелить проще простого.
В общем, я люблю крайности. Смешивать ООП с обобщённым программированием, как товарищ ct0r предложил - мерзость по сути. Придерживаясь одной идеи нет конфликтов идей, как это часто происходит в Си++.
Цитата Сообщение от ct0r Посмотреть сообщение
В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста без призыва шаблонов и показать, насколько увеличилось удобство использования и производительность.
Смотря в какой области. Если в непосредственном использовании, то скорее больше минусов, чем плюсов. Производительность только падает.
Если же в разработки, то она как по маслу. Разделение заявления / реализации - на ура. Убогих темплейтов - минимум.
Цитата Сообщение от Jupiter Посмотреть сообщение
а зачем нам ещё один objective-c ?
Затем, что это не Objective C. ЕМНИП, это вообще не то. Да, он забавный, но всё же немного не то.
Цитата Сообщение от Jupiter Посмотреть сообщение
как я понял то товарищ AnyOne697 предлагает "взять все, да и поделить" унаследовать от Object
Не совсем так. Суперпредок нужен в основном только для того, чтобы избавиться от шаблонов. По крайне менее, в рамках этой темы. И начиналось именно с этого.

Вообще, я тут распинаюсь, а зачем мне это?.. Я же написал, что я прекрасно понимаю мощь темплейтов. Но не нужным мне они, ваши темплейты. Лучше бы доработали мультипоточность или добавили бы нормальные умные указатели (без использования темплейтов - с ними они уже очень давно были). Или добавили бы минимальную поддержку графики (необязательную). Да, снова получается Java. Но Си++ интересен тем, что всегда есть выбор. И это круто. Этим он крут. Из-за этого я не могу полностью с него слезть.

Добавлено через 10 минут
Цитата Сообщение от kamre Посмотреть сообщение
Вот именно что нет в Java "банального агрегатора данных". Ключевое отличие value types от reference types знаете? Попробуйте на Java реализовать эффективный тип данных для комплексных чисел с возможностью выбора базового типа хотя бы из float/double. Эффективный тип данных - это такой, при использовании которого не будет потерь производительности по сравнению с вручную написанным кодом под специальные случаи.
Если не считать незначительные потери на virtual-функции, то можно. Если применить джедайскую магию, тоже можно. Вообще всё можно.
Цитата Сообщение от _stealth_ Посмотреть сообщение
такая общность весьма разная. наследование (public) - Х есть (is) У. включения экземпляра другого класса в класс - X имеет (has) Y (вот не надо сейчас эту тему развивать ). а шаблон такие-то классы обрабатываются по одному и тому же шаблону (при этом они не is и не has).
когда нужно что-то выразить, то просто выбираешь нужно средство.
Как-то одномерно. Давайте хотя бы плоско: X: O, Y: O. То есть X is O, Y is O. Но что есть X и Y?..
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 01:32 #29
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Легко.
и шарп и джава ушли от использования безтиповых коллекций (типичный ArrayList), ты же предлагаешь отбросить их горький опыт и вернутся на десятилетие назад
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:38 #30
Цитата Сообщение от Jupiter Посмотреть сообщение
и шарп и джава ушли от использования безтиповых коллекций (типичный ArrayList), ты же предлагаешь отбросить их горький опыт и вернутся на десятилетие назад
Горький опыт обоснован. Как показывает практика производительность действительно возрастает, так как мы имеем доступ к неплохим "ручным" оптимизациям (так как знаем, что оптимизировать). Конечно, пример с целочисленным немного надуман. Но в общем и целом. Тем более это удобно, когда внезапно возникает многопоточность.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2013, 01:38
Привет! Вот еще темы с ответами:

Перегрузка операторов и templates - C++
Добрый вечер!! Разбираюсь дальше с классами и шаблонами. Никак не получается создать класс Матрица. Знаю, что в интернете полно...

Variadic templates fail - C++
Здравствуйте. У меня проблема, нужно реализовать в проекте функционал, который будет использовать шаблоны с переменным количеством...

Result_of + variadic templates - C++
Как здесь можно вывести возвращаемый тип функторов? res_t должен получиться типом которым они параметризуются.template <typename ... F> ...

Ошибка: templates may not be 'virtual' - C++
Здравствуйте форумчане. Какими способами можно избежать этой ошибки? ошибка: templates may not be 'virtual' class IObject { ...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
11.10.2013, 01:38
Ответ Создать тему
Опции темы

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