Интернет богат информацией об STL. Если ввести в любой поисковой системе запрос «STL», вы получите сотни ссылок, часть из которых даже будет содержать полезную информацию. Впрочем, большинство программистов STL в поисках не нуждается и хорошо знает следующие сайты:
• сайт SGI STL, http://www.sgi.com/tech/stl;
• сайт STLport, http://stlport.org;
• сайт Boost, http://www.boost.org.
Ниже я постараюсь объяснить, почему эти сайты заслуживают вашего внимания.
Сайт SGI STL
Web-сайт SGI STL не случайно находится в начале списка. На нем имеется подробная документация по всем компонентам STL. Многие программисты рассматривают его как основной источник электронной документации незав4исимо от используемой платформы STL. Документацию собрал Мэтт Остерн (Matt Austern), который позднее дополнил ее и представил в книге «Generic Programming and the STL» [4]. Материал не сводится к простому описанию компонентов STL. Например, описание потоковой безопасности контейнеров STL (см. совет 12) основано на материалах сайта SGI STL.
На сайте SGI программисту предлагается свободно распространяемая реализация STL. Она была адаптирована лишь для ограниченного круга компиляторов, но поставка STL легла в основу распространенной поставки STLport, описанной ниже. Более того, в реализацию STL от SGI входят некоторые нестандартные компоненты, делающие программирование в STL не только более мощным и гибким, но и более интересным. Некоторые из них стоит выделить.
• Хэшированные ассоциативные контейнеры hash_set
, hash_multiset
, hash_map
и hash_multimap
. За дополнительной информацией об этих контейнерах обращайтесь к совету 25.
• Односвязный список slist
. Контейнер slist
реализован наиболее стандартным образом, а итераторы указывают на те узлы списка, на которые они и должны указывать. К сожалению, этот факт оборачивается дополнительными затратами при реализации функций insert и erase, поскольку обе функции должны модифицировать указатель на следующий узел списка в узле, list
) это не вызывает проблем, но в односвязном списке возврат к предыдущему узлу является операцией с линейной сложностью. В контейнере slist
из реализации SGI функции insert
и erase
выполняются с линейной сложностью вместо постоянной, что является существенным недостатком. В реализации SGI эта проблема решается при помощи нестандартных (но зато работающих с постоянной сложностью) функций insert_after
и erase_after
. В сопроводительной документации говорится:
…Если окажется, что функции insert_after
и erase_after
плохо подходят для ваших целей, и вам часто приходится вызывать функции insert
и erase
в середине списка, вероятно, вместо slist
лучше воспользоваться контейнером list
.
В реализацию Dinkumware также входит односвязный список slist
, но в нем используется другая архитектура итераторов, сохраняющая постоянную сложность при вызовах insert и erase. За дополнительной информацией о Dimkumware обращайтесь к приложению Б.
• Контейнер rope
, аналог string
для очень больших строк. В документации SGI контейнер rope
описывается так:
Контейнер rope
представляет собой масштабированную разновидность string
: он предназначен для эффективного выполнения операций со строками в целом. Затраты времени на такие операции, как присваивание, конкатенация и выделение подстроки, практически не зависят от длины строки. В отличие от строк C, контейнер rope
обеспечивает разумное представление для очень длинных строк (например, содержимого буфера текстового редактора или сообщений электронной почты).