Вход/Регистрация
РУКОВОДСТВО ПО СТАНДАРТНОЙ БИБЛИОТЕКЕ ШАБЛОНОВ (STL)
вернуться

Менг Ли

Шрифт:

Несколько более реалистичный пример - фильтрующая программа, которая берёт файл и беспорядочно перетасовывает его строки.

main(int argc, char**) {

 if (argc!= 1) throw("usage: shuffle\n");

 vector‹string› v;

 copy(istream_iterator‹string›(cin), istream_iterator‹string›, inserter(v, v.end));

 random_shuffle(v.begin, v.end);

 copy(v.begin, v.end, ostream_iterator‹string›(cout));

}

В этом примере copy перемещает строки из стандартного ввода в вектор, но так как вектор предварительно не размещён в памяти, используется итератор вставки, чтобы вставить в вектор строки одну за другой. (Эта методика позволяет всем функциям копирования работать в обычном режиме замены также, как в режиме вставки.) Потом random_shuffle перетасовывает вектор, а другой вызов copy копирует его в поток cout.

Требования

Для гарантии совместной работы различные компоненты библиотеки должны удовлетворять некоторым основным требованиям. Требования должны быть общими, насколько это возможно, так что вместо высказывания "класс X должен определить функцию-член operator++ ", мы говорим "для любого объекта x класса X определён ++x ". (Не определено, является ли оператор членом или глобальной функцией.) Требования установлены в терминах чётких выражений, которые определяют допустимые условия типов, удовлетворяющих требованиям. Для каждого набора требований имеется таблица, которая определяет начальный набор допустимых выражений и их семантику. Любой обобщённый алгоритм, который использует требования, должен быть написан в терминах допустимых выражений для своих формальных параметров.

Если требуется, чтобы была операция линейного времени сложности, это значит - не хуже, чем линейного времени, и операция постоянного времени удовлетворяет требованию.

В некоторых случаях мы представили семантические требования, использующие код C++. Такой код предназначен как спецификация эквивалентности одной конструкции другой, не обязательно как способ, которым конструкция должна быть реализована (хотя в некоторых случаях данный код, однозначно, является оптимальной реализацией).

Основные компоненты

Этот раздел содержит некоторые основные шаблонные функции и классы, которые используются в остальной части библиотеки.

Операторы (Operators)

Чтобы избежать избыточных определений operator!= из operator== и operator›, ‹=, ›= из operator‹, библиотека обеспечивает следующее:

template ‹class Tl, class T2›

inline bool operator!=(const T1& x, const T2& y) {

 return !(x == y);

}

template ‹class Tl, class T2›

inline bool operator›(const T1& x, const T2& y) {

 return y ‹ x;

}

template ‹class Tl, class T2›

inline bool operator‹=(const T1& x, const T2& y) {

 return !(y ‹ x);

}

template ‹class Tl, class T2›

inline bool operator›=(const T1& x, const T2& y) {

 return !(x ‹ y);

}

Пара (Pair)

Библиотека включает шаблоны для разнородных пар значений.

template ‹class T1, class T2›

struct pair {

 T1 first;

 T2 second;

 pair {}

 pair(const T1& x, const T2& y): first(x), second(y) {}

};

template ‹class T1, class T2›

inline bool operator==(const pair‹Tl,T2›& x, const pair‹Tl,T2›& y) {

 return x.first == y.first && x.second == y.second;

}

template ‹class T1, class T2›

inline bool operator‹(const pair‹Tl,T2›& x, const pair‹Tl,T2›& y) {

 return x.first ‹ y.first || (!(y.first ‹ x.first) && x.second ‹ y.second);

  • Читать дальше
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: