эффективное использование STL
Джосьютис прочитан туда и обратно, а также Липпман и др.
когда начал использовать STL, то столкнулся с фондументальными проблемами:
1. отсутствие хорошо организованного справочника.. честно говоря из найденного один лучше другого.. описания через base_..<> просто сбивают с толку, шаблоны собранные из других шаблонов, которые в свою очередь собираются из кучи вспомогательных шаблонов.. что реально творится в std? чем пользуется уважаемый all?
2. генерация кода с использованием STL поражает. там где сказано, что использование шаблонов позволит генерировать минимально избыточный код полностью противоречит практике. в коде с полной оптимизацией откуда-то берутся тонны base_..??@ и т.д. кроме того не понял гарантированно присутствующей "Januar Februar Marth...." и т.п. инфы. нафига она мне? я даже не использую cin и cout, только механизм istream и ostream (да и без них ситуация не на много лучше). это нормально?
3. на сколько эффективна <string>? я понимаю, подсчёт ссылок, но как понять многократное выделение-уничтожение динамической памяти, не согласующееся с выполняемой полезной работой? используя string напрягать извилины приходится почему-то больше, чем с char*.. или не стоит на этом заморачиваться? книжки говорят об этом весьма пространно.
4. есть смысл использовать локальные контексты? если да, то следующий вопрос - как? ну я нашёл примеры, и горстку информации.. примеры компилируются, но дальше контекста "С" я не ушёл :( конечно можно забить и юзать С-шную глобальную локалку, либо обращаться например у winapi.. чего мне крайне не хотелось бы делать в реально независимом проекте
..доступ к нету у меня весьма ограниченный, но покопавшись я нашёл, что есть два лагеря - один люто ненавидит STL, другой просто его игнорирует.. отдельные чо-то собирают с использованием минимальных возможностей библиотеки. мне лично она нравится, поэтому я хочу использовать её "эффективно" :) на сколько я безнадежен?
а вот проблемы - они батенька, ФУНДАМЕНТАЛЬНЫЕ. а не то, что вы написали :)
2. генерация кода с использованием STL поражает. там где сказано, что использование шаблонов позволит генерировать минимально избыточный код полностью противоречит практике. в коде с полной оптимизацией откуда-то берутся тонны base_..??@ и т.д. кроме того не понял гарантированно присутствующей "Januar Februar Marth...." и т.п. инфы. нафига она мне? я даже не использую cin и cout, только механизм istream и ostream (да и без них ситуация не на много лучше). это нормально?
Сдаётся мне, что всё это происходит потому, что потоки (будь то строковые или файловые, или обычные) используют библиотеку локалей ( собственно что и приводит к увеличению размера генерируемого кода).
P.S.: А разве cin и cout не являются экземплярами istream и ostream соответственно?
1. msdn 2005 (правда у меня есть только msdn 2003, но думаю расхождений не должно быть..)
2. k3Eahn согласен, что используют. но я так понел это в связи с гарантированной генерацией кода для cin и cout, даже если я их нигде не привлекаю? всё равно не понимаю такую принудительную техподдержку... это как-то отключается?
3. со стрингами относительно понятно.. может где уже было бурное их обсуждение? отошлите меня плз если ссылки завалялись..
4. что насчёт локалей? как мне гарантированно заявить русский локальный контекст к примеру? или лучше писать свои собственные фацеты? для всех языков мира же не опишешь.. а мне казалось интернационализация....
спасибо за ответы! хотя подозреваю, что вопросы были детские..
msdn 2005 (правда у меня есть только msdn 2003, но думаю расхождений не должно быть..)
Именно по STL доки лежат здесь: http://www.sgi.com/tech/stl/
2. k3Eahn согласен, что используют. но я так понел это в связи с гарантированной генерацией кода для cin и cout, даже если я их нигде не привлекаю? всё равно не понимаю такую принудительную техподдержку... это как-то отключается?
Во-первых, потоки входят в стандартную библиотеку C++, а не в STL.
Во-вторых, какой смысл инстанцировать basic_istream, basic_ostream, если ты в своём коде не использешь cin, cout? Ответ: никакого.
А вообще,если ты не используешь потоки(basic_istream, basic_ostream, basic_istringstream, basic_ostringstream, basic_ifstream и т.п.) - это ещё не значит что подобного рода инфа не включается. Вон взять ту же реализацию STL'я STLPort - несмотря на то, что потоки не используются, локали, получается, всё равно используются, поскольку кое-какая инфа всё равно добавляется.
P.S.: По поводу "раздувшейся" при использовании iostream'ов программы не стоит особо париться. Если уж очень это "мешает", и ты используешь только cin, cout, wcin, wcout, то линкуй RTL динамически.
дык устаревшие же.. не то, чтобы они были не правильные, но они относятся к SGI STL, когда я имею в виду STL из стандартной библиотеки? или нельзя её так называть?
:() эээ... а я не могу использовать basic_istream/ostream не в консольном режиме, а в оконном, например, для работы с файлами, текстовыми конфигами и т.п. ? тогда какой смысл в cin/cout?
ещё вопрос, в бинарном режиме использовать потоки целесообразно?
STLPort это труднокомпилируемый ужос, который я таки прикрутил к DigitalMars.. ни к чему другому прикручивать не захотелось
Zorkus сенкс!
Википедия о STL - ru;
Википедия о STL - eng;
) эээ... а я не могу использовать basic_istream/ostream не в консольном режиме, а в оконном, например, для работы с файлами, текстовыми конфигами и т.п. ?
Думаю, можешь. Во всяком случае я не видел, чтобы кто-нибудь запрещал использовать потоковый ввод/вывод в гуёвых приложениях.
Только вот basic_ostream/basic_istream в голом виде не используется. По большому счёту они играют роль базовых классов (тот же basic_ofstream, basic_ostringstream наследуются от basic_ostream).
тогда какой смысл в cin/cout?
[quote=Standard]The object cout controls output to a stream buffer associated with the object stdout, declared in
<cstdio> [/quote]
[quote=MSDN]The object controls insertions to the standard output as a byte stream.[/quote]
Т.е. cout - есть объект класса basic_ostream<char, char_traits<char> >, настроенный для вывода в стандартный вывод.
ещё вопрос, в бинарном режиме использовать потоки целесообразно?
ИМХО, файловые потоки больше всего подходят для работы с текстовыми файлами.
ИМХО, файловые потоки больше всего подходят для работы с текстовыми файлами.
Почему? На чем основано такое предпочтение?
:() эээ... а я не могу использовать basic_istream/ostream не в консольном режиме, а в оконном, например, для работы с файлами, текстовыми конфигами и т.п. ? тогда какой смысл в cin/cout?
ещё вопрос, в бинарном режиме использовать потоки целесообразно?
Много раз говорилось на форуме - STL служат для реализации прикладной логики, это не gui - библиотека, в отличие от, скажем, mfc. И сочетается с любыми вышеуказанными библиотеками, если те (и компиляторы) в достаточной степени реализуют современный стандарт С++.
Потому что они более удобны при работе с текстовыми файлами в сравнении с более низкоуровнероневыми file management API.
Да и так уж повелось, что fstream в большей степени ассоциируется с текстовыми файлами, чем с бинарными.