Использование библиотеки STL

Первые шаги

Для того, чтобы в программе можно было пользоваться функциональностью STL, следует подключить соответствующие заголовочные файлы. Большинство контейнеров описываются в заголовочном файле, имя которого совпадает с типом контейнера. Расширения у заголовочных файлов при этом отсутствует. Например, если вы планируете использовать в своей программе стандартный контейнер stack, то в программу следует добавить следующую директиву:

#include <stack>
Типы контейнеров, а также алгоритмы, функторы, да и вообще вся библиотека STL определены не в глобальном пространстве имён. Ввиду большого количества зарезервированных слов в STL, все они вынесены в отдельное пространство имён, получившее название std.

Существует несколько способов пользоваться ключевыми словами из пространства имён std. Универсального, стопроцентно пригодного на все случаи жизни решения искать не следует, у каждого метода есть свои преимущества и недостатки. Перечислим их.

  1. Добавить строку
    using namespace std;
    
    непосредственно после всех подключаемых (#include) файлов.

    Это решение плохо тем, что в STL есть ряд достаточно простых зарезервированных слов (например, swap, set, find, count), и подобное подключение пространства имён std потребует от программиста аккуратности в выборе названий для своих классов и функций. Тем не менее, если вы поставили себе целью овладеть STL в совершенстве, автор рекомендует использовать подключение пространства имён std именно в таком формате.

  2. Подключить желаемые модули STL отдельными директивами using:
       using std::stack;
       using std::find;
    
  3. Использовать директиву typedef для каждого используемого типа:
       typedef std::vector<int> VI;
    

  4. Писать префикс std:: перед каждым STL типом данных либо алгоритмом.
Кроме того, не следует забывать про «особенность» парсеров компиляторов C++ в части описания шаблонов. Как вы помните, параметры шаблонов перечисляются в угловых скобках. При этом, две подряд идущих угловых скобки большинство трансляторов (совершенно справедливо) воспринимают как операцию «<<» или «>>». Поэтому, при наличии в коде вложенных STL конструкций следует не забывать оставлять между ними пробельный символ. Пример:
// Нехорошо: две закрывающих угловых скобки подряд
vector<vector<int>> WrongDefinition; 

// ОК 
vector< vector<int> > RightDefinition;
Забегая вперёд, следует заметить, что один из наиболее удачных способов борьбы с подобными ошибками -- использование typedef. Повторяя предыдущий пример:
typedef vector<int> vi;
typedef vector<vi> vvi;