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

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

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

templates, STL - C++

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

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

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

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

C++ Generic inheritance. Templates
C++11::templates::compilation failure C++
Variadic Templates C++
C++ Variadic templates fail
Variadic templates C++
C++ Variadic templates
C++ Result_of + variadic templates
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XRuZzz
10.10.2013, 23:14     templates, STL
  #21

Не по теме:

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

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

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

В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста без призыва шаблонов и показать, насколько увеличилось удобство использования и производительность.
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,062
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 23:23     templates, STL #23
Цитата Сообщение от ct0r Посмотреть сообщение
В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста
Да хотя бы vector из STL.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.10.2013, 23:30     templates, STL #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

Не по теме:

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

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

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

В общем, этот пример неубедителен.
Простой std::list проще, нагляднее и скорее всего еще и эффективнее, в основном
за счет использования шаблонов.
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
11.10.2013, 00:53     templates, STL #27
Цитата Сообщение от Убежденный Посмотреть сообщение
И как в такой list вставить экземпляр типа int ?
Это как в Яве (если без generics) - нужен враппер (Integer), а потом касты при извлечении из колекции...
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:21     templates, STL #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?..
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 01:32     templates, STL #29
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Легко.
и шарп и джава ушли от использования безтиповых коллекций (типичный ArrayList), ты же предлагаешь отбросить их горький опыт и вернутся на десятилетие назад
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:38     templates, STL #30
Цитата Сообщение от Jupiter Посмотреть сообщение
и шарп и джава ушли от использования безтиповых коллекций (типичный ArrayList), ты же предлагаешь отбросить их горький опыт и вернутся на десятилетие назад
Горький опыт обоснован. Как показывает практика производительность действительно возрастает, так как мы имеем доступ к неплохим "ручным" оптимизациям (так как знаем, что оптимизировать). Конечно, пример с целочисленным немного надуман. Но в общем и целом. Тем более это удобно, когда внезапно возникает многопоточность.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 01:41     templates, STL #31
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Тем более это удобно, когда внезапно возникает многопоточность.
чем шаблоны мешают многопоточности? что за хрень ты тут доказываешь?
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 01:41     templates, STL #32
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Попробуйте на Java реализовать эффективный тип данных для комплексных чисел с возможностью выбора базового типа хотя бы из float/double.
Если не считать незначительные потери на virtual-функции, то можно. Если применить джедайскую магию, тоже можно. Вообще всё можно.
Какие еще виртуальные функции? Какая еще "джедайская магия"?

Например, нужно уложить несколько миллионов комплексных чисел в контейнер и не потерять производительность при их обработке. C++ это легко позволяет сделать с помощью шаблонов (complex<T> и vector<T>) без какой-либо потери производительности вроде кучи аллокаций в heap, лишней косвенности и т.п. Все данные будут лежать одним куском в памяти и обрабатываться максимально эффективно, при этом все будет в объектах с удобным интерфейсом.

Чтобы добиться подобной производительности в Java придется полностью выбросить все абстракции и работать напрямую с массивом из double или float, где под каждое комплексное число будет отводиться два double/float. Причем даже ArrayList нельзя будет использовать для double/float из-за boxing. Не позволяют механизмы абстракции в Java получать эффективный код, слишком они там простенькие, даже в C# куда лучше будут.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:59     templates, STL #33
Цитата Сообщение от kamre Посмотреть сообщение
Какие еще виртуальные функции? Какая еще "джедайская магия"?
Например, нужно уложить несколько миллионов комплексных чисел в контейнер и не потерять производительность при их обработке. C++ это легко позволяет сделать с помощью шаблонов (complex<T> и vector<T>) без какой-либо потери производительности вроде кучи аллокаций в heap, лишней косвенности и т.п. Все данные будут лежать одним куском в памяти и обрабатываться максимально эффективно, при этом все будет в объектах с удобным интерфейсом.
Чтобы добиться подобной производительности в Java придется полностью выбросить все абстракции и работать напрямую с массивом из double или float, где под каждое комплексное число будет отводиться два double/float. Причем даже ArrayList нельзя будет использовать для double/float из-за boxing. Не позволяют механизмы абстракции в Java получать эффективный код, слишком они там простенькие, даже в C# куда лучше будут.
Такие.
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
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
class Object {
    /***/
}
 
class Complex : Object {
public:
    Complex ( double r, double i );
    Complex ( double n );
    Complex ( Complex& c );
    
    /* ... operator [ *,=,-,+,/,<<,>> ... ] */
    double operator double (); // ||c||
private:
    double m_real;
    double m_img;
}
 
class List : Object {
public:
    /***/
    virtual Object put ( Object o, int i = 0 );
    virtual Object get ( int i );
    /***/
private:
    /***/
}
 
int main(void) {
    List list;
    Complex c ( 2.5, -1.3 );
    list.put ( c );
    /****/
    cout << list.put ( 3 );
    
    return 0;
}
Это набросок по памяти. Конечно, Object считал указатели и всё такое. Именно поэтому были и такие "уроды":
C++
1
2
3
4
5
6
7
8
9
class ComplexList : Object {
public:
    /***/
    Complex put ( Complex c, int i = 0 );
    Complex get ( int i );
    /***/
private:
    /***/
}
Это кажется не настолько удобным, как шаблоны. Но мы взялись реализовать собственную библиотеку. И сделали. И ничего страшного. И всё нормально. И живём пока. И вроде даже проект живёт.
И кстати, лично мне кажется это более удобным, чем шаблоны. Особенно при использовании. Как будно пишешь на выразительном скриптовом языке без кучи звёздочек и знаков меньше-больше.

Добавлено через 5 минут
Алсо, совсем забыл. Здесь получается интересная штука - можно в один лист запихать объекты разного типа. Но, как я говорил, не хватает рефлексии.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 02:03     templates, STL #34
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Такие.
Почему захардкодили double внутри Complex? Нужна поддержка как минимум еще и float!

И уже видно, что copy-paste - это ваш метод, под каждую специализацию ручной copy-paste. Очень элегантно и эффективно. Получается, что нужно этим методом сделать ComplexDouble, ComplexFloat, ComplexDoubleList, ComplexFloatList, такой у вас подход?
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
11.10.2013, 02:04     templates, STL #35
а в Qt как реализованы Qcontainers?
MrGluck
Ворчун
Эксперт CЭксперт С++
6435 / 3633 / 452
Регистрация: 29.11.2010
Сообщений: 9,602
11.10.2013, 02:04     templates, STL #36
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Приходилось по особому делать копирующие конструкторы и вообще аккуратно работать с памятью
Рядом лежала вилка, но мы ели руками так как не шли на поводу орудия дьявола.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Я читал код буста. И честно - потом долго отходил. Да, там интересно реализованы некоторые вещи. Но при этом понимаешь, что нужно слишком круто владеть таким инструментом, как Си++. Да и ногу лишний раз прострелить проще простого.
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Перейдя на чистую объектную модель мы ускорили время компиляции более чем в 5 раз (производительность снизилась в пределах погрешности). К тому же, количество кода в заголовчных сократилась в 10 раз (хоть за счёт и расширения cpp-файлов, но им 2k это нормально).
Вы все перевернули с ног на голову. Буст позволяет не писать собственные велосипеды и оберегает от ошибок, шаблоны позволяют сделать общий код и таки сократить разбухание кода, а не наоборот. Вы же просто впихнули с хедеров в сипипишки код помноженный на кол-во типов, являющимися ранее параметрами шаблона.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Впрочем, в Си++ что-то странное сотворили со структурами от чего они стали... Запутанными.
Возможно, только для вас.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Придерживаясь одной идеи нет конфликтов идей
Отныне и всегда буду есть ложкой, чтобы не вызвать конфликт инструментов.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Конечно, пример с целочисленным немного надуман. Но в общем и целом.
Все-таки признали, что пример неудачен, а ничего стоящего так и не предложили. Вывод только на конце как будто аксиома доказана.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Окей, закроем глаза на "баг"
Где баг?

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Тем более это удобно, когда внезапно возникает многопоточность.
std::lock_guard<>
std::unique_lock<>
std::future<>
std::promise<>
std::packaged_task<>
не нужно!

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Как будно пишешь на выразительном скриптовом языке без кучи звёздочек и знаков меньше-больше.
То бишь без комментариев и алгебры булевых функций?

Цитата Сообщение от XRuZzz Посмотреть сообщение
но смысл почему не надо использовать шаблоны не понял.
Потому что у него не получилось их использовать и решено было сделать все наперекосяк. Зато хедеры маленькие и время компиляции меньше. Мы ведь пишем программы чтобы компилировать.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 02:24     templates, STL #37
Цитата Сообщение от Хулиган Посмотреть сообщение
а в Qt как реализованы Qcontainers?
на шаблонах
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 07:47     templates, STL #38
Окей. Кажется меня здесь начинают... неправильно понимать. Подозреваю это было с самого начало.

Я не категорически против шаблонов. Я понимаю насколько мощный инструмент. Просто они меня раздражают. Мне они не нравяться, но это не значит, что я их не использую. Конечно использую, но не так активно, как это делают stl'и и бусты.

Цитата Сообщение от kamre Посмотреть сообщение
Почему захардкодили double внутри Complex? Нужна поддержка как минимум еще и float!
И уже видно, что copy-paste - это ваш метод, под каждую специализацию ручной copy-paste. Очень элегантно и эффективно. Получается, что нужно этим методом сделать ComplexDouble, ComplexFloat, ComplexDoubleList, ComplexFloatList, такой у вас подход?

Да мы переписали библиотеку. Но работа с числами интуитивна - что за бредовый ComplexFloat? А ComplexInteger? Что это за вырождение. double уже покрывает максимально возможное количество значений. Мы же не на микроконтроллеры пишем, что бы на float'ах экономить.

Успокойтесь.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 08:15     templates, STL #39
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Мы же не на микроконтроллеры пишем, что бы на float'ах экономить.
При выводе 3d графики до сих пор эффективнее с float работать (меньше данных в GPU пересылать, и с float GPU намного быстрее работают пока). А, например, считать физику можно в double на CPU. Так что не нужно тут про микроконтроллеры. Вообще уже понятно, что на эффективность обобщенного кода вам наплевать (все подряд наследуем от Object и аллоцируем в куче). А когда вдруг нужна эффективность, то начинаете вручную инстанцировать шаблоны методом copy-paste.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2013, 08:50     templates, STL
Еще ссылки по теме:

Templates внутри класса C++
C++ Перегрузка операторов и templates
Passing member functions into templates C++
C++ Ошибка: templates may not be 'virtual'
Variadic templates C++

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

Или воспользуйтесь поиском по форуму:
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 08:50     templates, STL #40
Цитата Сообщение от kamre Посмотреть сообщение
При выводе 3d графики до сих пор эффективнее с float работать (меньше данных в GPU пересылать, и с float GPU намного быстрее работают пока). А, например, считать физику можно в double на CPU.
3D-графика немного другая тема. Во-первых, ни о какой 3D-графики у нас не шло и речи. Во-вторых, если экономить, то лучше использовать оптимизации на уровне драйвера, а не экономии на пересылках double. Более того, float по производительности почти такой в современных картах и CPU, тогда как точность, пусть и выше, но не избавляет от погрешностей округления, систем исчисления, разницы в реализациях (и соответственно - точности, скорости) и подобного. В суперточных вычислениях выгоднее использовать собственные структуры. Да и кто вообще вздумает использовать generic complex на GPU?.. Лучше туда масивами попарно пихать. И ведь нормально, ничего страшного.

Да и вообще, может уже пора закончить?.. Бессмысленный спор, ИМХО.
Yandex
Объявления
11.10.2013, 08:50     templates, STL
Ответ Создать тему
Опции темы

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