Руководство по стандартной библиотеке шаблонов STL


Структура библиотеки - часть 3


main(int argc, char** argv) { if(argc != 2) throw("usage: remove_if_divides integer\n "); remove_copy_if(istream_iterator(cin), istream_iterator(), ostream_iterator(cout, "\n"), not1(bind2nd (modulus(), atoi(argv[1])))); }

    Вся работа выполняется алгоритмом remove_copy_if, который читает целые числа одно за другим, пока итератор ввода не становится равным end-of-stream (конец-потока) итератору, который создаётся конструктором без параметров. (Вообще все алгоритмы работают способом "отсюда досюда", используя два итератора, которые показывают начало и конец ввода.) Потом remove_copy_if записывает целые числа, которые выдерживают проверку, в выходной поток через итератор вывода, который связан с cout. В качестве предиката remove_copy_if использует функциональный объект, созданный из функционального объекта modulus<int>, который берёт i и j и возвращает i % j как бинарный предикат, и превращает в унарный предикат, используя bind2nd, чтобы связать второй параметр с параметром командной строки atoi(argv[1]). Потом отрицание этого унарного предиката получается с помощью адаптера функции not1.

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

main(int argc, char**) { if(argc != 1) throw("usage: shuffle\n"); vector v; copy(istream_iterator(cin),istream_iterator(), inserter(v, v.end())); random_shuffle(v.begin(), v.end()); copy(v.begin(), v.end(), ostream_iterator(cout)); }

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




Начало  Назад