Примеры программ на stl

Помимо контейнерных классов и итераторов, STL также предоставляет ряд обобщенных алгоритмов для работы с элементами контейнерных классов. Они позволяют вам выполнять такие действия, как поиск, сортировка, вставка, переупорядочивание, удаление и копирование элементов объекта контейнерного класса.

Обратите внимание, что алгоритмы реализованы как функции, которые работают с итераторами. Это означает, что каждый алгоритм необходимо реализовать только один раз, и, как правило, он будет автоматически работать для всех контейнеров, которые предоставляют набор итераторов (включая ваши пользовательские классы контейнеров). Хотя они очень мощные и могут дать возможность очень быстро писать сложный код, у них есть и обратная сторона: какая-либо комбинация алгоритмов и типов контейнеров может не работать, может вызывать бесконечные циклы или может работать, но очень плохо. Поэтому используйте их на свой страх и риск.

STL предоставляет довольно много алгоритмов – здесь мы коснемся только некоторых из наиболее распространенных и простых в использовании. Остальное (и все подробности) мы сохраним для главы об алгоритмах STL.

Знакомство с STL

Чтобы использовать любой из алгоритмов STL, просто включите заголовочный файл algorithm .

min_element и max_element

Алгоритмы std::min_element и std::max_element находят минимальный и максимальный элементы в объекте контейнерного класса. std::iota генерирует непрерывную последовательность значений.

#include // std::min_element и std::max_element #include #include #include // std::iota int main() < std::listli(6); // Заполняем li числами, начиная с 0. std::iota(li.begin(), li.end(), 0); std::cout

Этот код печатает:

find (и list::insert )

В этом примере мы будем использовать алгоритм std::find() , чтобы найти значение в списке, а затем используем функцию list::insert() , чтобы добавить новое значение в список в этой точке.

#include #include #include #include int main() < std::listli(6); std::iota(li.begin(), li.end(), 0); // Находим значение 3 в списке auto it< find(li.begin(), li.end(), 3) >; // Вставляем 8 прямо перед 3. li.insert(it, 8); for (int i : li) // цикл for с итератором std::cout

Этот код напечатает значения

0 1 2 8 3 4 5

Когда алгоритм поиска не находит то, что искал, он возвращает итератор end .

Если бы мы не знали наверняка, что среди элементов li есть значение 3, то, прежде чем использовать возвращенный итератор для чего-либо еще, нам нужно было бы проверить, нашла ли его std::find .

if (it == li.end()) < std::cout else < // . >

sort и reverse

В этом примере мы отсортируем вектор, а затем перевернем его.

#include #include #include int main() < std::vectorvect< 7, -3, 6, 2, -5, 0, 4 >; // сортируем вектор std::sort(vect.begin(), vect.end()); for (int i : vect) < std::cout std::cout << ‘n’; // переворачиваем вектор std::reverse(vect.begin(), vect.end()); for (int i : vect) < std::cout std::cout

Этот дает следующий результат:

1. Первая программа в Step 7 / Для новичков в программировании Simatic


-5 -3 0 2 4 6 7 7 6 4 2 0 -3 -5

В качестве альтернативы мы могли бы передать в качестве третьего аргумента std::sort пользовательскую функцию сравнения. В заголовке есть несколько функций сравнения, которые мы можем использовать, поэтому нам не нужно писать свои собственные. Мы можем передать в std::sort функцию std::greater и удалить вызов std::reverse . Вектор сразу будет отсортирован по убыванию.

Обратите внимание, что std::sort() не работает с контейнерным классом списка – класс list предоставляет свою собственную функцию-член sort() , которая намного эффективнее, чем обобщенная версия.

Заключение

Хотя это лишь часть алгоритмов, которые предоставляет STL, этого должно быть достаточно, чтобы показать, насколько легко их использовать в сочетании с итераторами и базовыми классами контейнеров. Оставшихся алгоритмов хватит, чтобы заполнить целую главу!

Источник: radioprog.ru

5. Язык stl на примере контроллера s7-200. Пример: Разветвленная программа на языке stl.

Серьезные программы пишутся на языке STL. Работа ведется с битовым 8-уровневым бездонным стеком.

Нормально разомкнутые контакты

Первая команда программы загружается на вершину стека. Для этого используется команда LD. Например, в программе реверсивного включения АД команда LD I0.0 загружает бит I0.0 на вершину стека.

Далее, если в схеме идут нормально разомкнутые контакты, то вызываются команды A (And – И) или O (Or – ИЛИ).

А вызывается при последовательном включении следующего контакта, а команда

О – при параллельном включении контакта.

Читайте также:
К сервисным программам относятся проигрыватели видео и медиафайлов

В нашей программе Q0.0 соединен параллельно, а I0.0 соединен последовательно к двум предыдущим контактам. Ниже приведем полную программу на языке STL.

LD I0.0 //загрузка бита I0.1

O Q0.0 // операция ИЛИ

A I0.1 // операция И

= Q0.0 // операция копирования

Команды A и O выполняют операцию И или ИЛИ между битом-операндом и битом с вершины стека. Результат операции записывается в вершину стека, вместо предыдущего бита.

Команда = Q0.0 копирует бит с вершины стека на бит Q0.0.

Нормально замкнутые контакты

Если первый контакт программы нормально замкнутый контакт, то используется команда загрузки LDN. Эта команда вначале инвертирует бит, а затем загружает на вершину стека.

Например, в ниже приведенной программе первый бит I0.1 – нормально замкнутый контакт. Для загрузки этого бита в стек следует выполнить команду LDN I0.1.

При последовательном соединении нормально замкнутого контакта с другим битовым значением в языке STL используют команду AN (операция НЕ-И), а при параллельном соединении – команду ON (операция НЕ-ИЛИ). Эти команды выполняют операции И или ИЛИ с инвертированным значением бита-операнда и бита, который находится на вершине стека.

Тем самым, наша программа на языке STL выглядит так:

LDN I0.0 //загрузка бита I0.1

ON Q0.0 // операция ИЛИ

AN I0.1 // операция И

= Q0.0 // операция копирования

Стековые операции

При создании разветвленных программ, промежуточные результаты приходится сохранять в стеке. В этом случае в стеке может находиться несколько битов. Для работы с таким стеком в STL имеется специальные команды, которых и рассмотрим ниже.

1. Логическое И двух битов стека — ALD

Э та команда выполняет операцию И между двумя битами с вершины стека. Результат загружается в вершину стека. После выполнения ALD глубина стека уменьшается на единицу. Здесь S0 = iv0 AND iv1.

2. Логическое ИЛИ двух битов стека – OLD

Э та команда выполняет операцию ИЛИ между двумя битами с вершины стека. Результат загружается в вершину стека. После выполнения ALD глубина стека уменьшается на единицу. Здесь S0 = iv0 OR iv1.

Пример 2. Реверсивное включение асинхронного двигателя (Включение Вперед)

В STL этот фрагмент программы имеет следующий вид:

LD I0.2 // Загрузка I0.2

LD I0.0 // Загрузка I0.0

O Q0.0 //Операция ИЛИ I0.0 и Q0.0

ALD //Операция И вершины стека и бита I0.2

AN Q0.1 //Операция НЕ-И вершины стека и бита Q0.1

= Q0.0 //Копирования вершины стека на выход Q0.0

3 . Дублирование вершины стека — LPS

Команда дублирования вершины логического стека (LPS -Logic Push) дублирует значение вершины стека и помещает это значение на вершину стека. Дно стека выталкивается и теряется.

4. Извлечение вершины стека — LPP

К оманда извлечения вершины стека (LPP — Logic Pop) извлекает один бит из стека. Второй уровень становится новой вершиной стека.

5. Копирование второго уровня стека — LRD

К оманда копирования второго уровня стека (LRD – Logic Read) копирует второй бит стека в вершину стека. В стек ничего не помещается и из него ничего не извлекается, но его вершина замещается копией.

6 . Загрузка стека LDS N

Команда загрузки стека (LDS – Load Stack) дублирует бит стека (N) и помещает это значение в вершину стека. Дно стека выталкивается и теряется.

Пример. Рассмотрим разветвленную программу на языке LAD. В STL эта программа имеет вид:

LPS // Сохраняем I0.0 во втором уровне стека

ALD //Логическое И со значением в стеке I0.0

LRD //Считывем второй уровень стека (I0.0)

ALD //Логическое И со значением в стеке

LPP //Выталкиваем вершину стека

Установка, сброс N битов

Команды установки и сброса бита в STL имеет следующий формат:

Положительный и отрицательный фронт

В STL контакту Положительный фронт соответствует команда EU (Edge Up).

В STL контакту Отрицательный фронт соответствует команда ED (Edge Down).

Источник: studfile.net

STL: стандартная библиотека шаблонов С++

Обложка: STL: стандартная библиотека шаблонов С++

Механизм шаблонов встроен в компилятор C++, чтобы дать возможность программистам делать свой код короче за счет обобщенного программирования. Естественно, существуют и стандартные библиотеки, реализующие этот механизм. STL является самой эффективной библиотекой C++ на сегодняшний день.

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

Читайте также:
Написать программу которая вычисляет среднее арифметическое n чисел

Первое знакомство

Для начала рассмотрим самые популярные коллекции из библиотеки. Каждая из них имеет собственный набор шаблонных параметров, чтобы быть максимально удобной для как можно большего спектра решаемых задач.

Коллекции

Для использования коллекции в своем коде используйте следующую директиву:

#include ,
где T — название коллекции

Итак, наиболее часто используются:

  • vector — коллекция элементов, сохраненных в массиве, изменяющегося по мере необходимости размера (обычно, увеличивающегося);
  • list — коллекция, хранящая элементы в виде двунаправленного связанного списка;
  • map — коллекция, сохраняющая пары вида , т.е. каждый элемент — это пара вида , при этом однозначная (каждому ключу соответствует единственное значение), где ключ — некоторая характеризующая значение величина, для которой применима операция сравнения; пары хранятся в отсортированном виде, что позволяет осуществлять быстрый поиск по ключу, но за это, естественно, придется заплатить: придется так реализовывать вставку, чтобы условие отсортированности не нарушилось;
  • set — это отсортированная коллекция одних только ключей, т.е. значений, для которых применима операция сравнения, при этом уникальных — каждый ключ может встретиться во множестве (от англ. set — множество) только один раз;
  • multimap — map , в котором отсутствует условие уникальности ключа, т.е. если вы произведете поиск по ключу, то получите не единственное значение, а набор элементов с одинаковым значением ключа; для использования в коде используется #include ;
  • multiset — коллекция с тем же отличием от set’а, что и multimap от map’а, т.е. с отсутствием условия уникальности ключа; для подключения: #include .

Строки

Любая серьезная библиотека имеет свои классы для представления строк. В STL строки представляются как в формате ASCII, так и Unicode:
string — коллекция однобайтных символов в формате ASCII;
wstring — коллекция двухбайтных символов в формате Unicode; включается командой #include .

Строковые потоки

strstream — используются для организации STL-строкового сохранения простых типов данных.
Разбор примеров начнем именно с этого класса.

//stl.cpp: Defines the entry point for the console application  #include «stdafx.h» #include #include #include using namespace std; int _tmain (int argc, _TCHAR* argv []) < strstream xstr; for (int i = 0; i < 10; i++) < xstr cout

Строковый поток — это буфер с нуль-терминатором в конце, поэтому при первой распечатке в конце строки оказывается мусор, т.е. получить реальный конец можно не посредством нуль-терминатора, а получив счетчик: pcount() . Затем «реальная часть» потока копируется в новую строку, и мы получаем распечатку уже без мусора.

Итераторы

Очень важное понятие в реализации динамических структур данных — итератор. Неформально итератор можно определить как абстракцию, которая ведет себя как указатель, возможно, с какими-то ограничениями. Строго говоря, итератор — более общее понятие, и является объектной оберткой для указателя, поэтому указатель является итератором. Примерно его устройство может выглядеть так:

class Iterator < T* pointer; public: T* GetPointer () < return this — >pointer; > void SetPointer (T* pointer) < this — >pointer = pointer; > >;

Вот несколько формализованных определений итератора:

  • Итераторы обеспечивают доступ к элементам коллекции
  • Для каждого конкретного класса STL итераторы определяются отдельно внутри класса этой коллекции.

Существуют три типа итераторов:

  • (forward) iterator — для обхода коллекции от меньшего индекса к большему;
  • reverse iterator — для обхода коллекции от большего индекс к меньшему;
  • random access iterator — для обхода коллекции в любом направлении.

Вот пример использования итераторов для удаления половин элементов коллекции:

#include «stdafx.h» #include #include #include using namespace std; void printInt (int number); int _tmain (int argc, _TCHAR* argv []) < vectormyVec; vector::iterator first, last; for (long i=0; i first = myVec.begin (); last = myVec.begin () + 5; if (last >= myVec.end ()) < return — 1; >myVec.erase (first, last); for_each (myVec.begin (), myVec.end (), printInt); return 0; > void printInt (int number)

Важно понимать, что при получении итератора на какой-то элемент коллекции и последующем изменении коллекции итератор может стать непригоден для использования.

Программист-разработчик C/C++ АО «Гринатом» , , можно удалённо , По итогам собеседования

Итерация вперед и аналогично назад происходит так:
for (iterator element = begin (); element

При использовании random access iterator, например, так:
for (iterator element = begin (); element

Методы коллекций

Основными методами, присутствующими почти во всех коллекциях являются следующие:

  • empty — определяет, пуста ли коллекция;
  • size — возвращает размер коллекции;
  • begin — возвращает прямой итератор, указывающий на начало коллекции;
  • end — возвращает прямой итератор, указывающий на конец коллекции, т.е. на несуществующий элемент, идущий после последнего;
  • rbegin — возвращает обратный итератор на начало коллекции;
  • rend — возвращает обратный итератор на конец коллекции;
  • clear — очищает коллекцию, т.е. удаляет все ее элементы;
  • erase — удаляет определенные элементы из коллекции;
  • capacity — возвращает вместимость коллекции, т.е. количество элементов, которое может вместить эта коллекция (фактически, сколько памяти под коллекцию выделено);
Читайте также:
Лучшие программы для 3д скульптинга

Вместимость коллекции, как было сказано в начале, меняется по мере надобности, т.е. если вся выделенная под коллекцию память уже заполнена, то при добавлении нового элемента вместимость коллекции будет увеличена, а все значения, бывшие в ней до увеличения, будут скопированы в новую область памяти — это довольно «дорогая» операция. Убедиться в том, что размер и вместимость — разные вещи, можно на следующем примере:

vector vec; cout cout

Vector

Самая часто используемая коллекция — это вектор. Очень удобно, что у этой коллекции есть такой же оператор operator [] , что и у обычного массива. Такой же оператор есть и у коллекций map , deque , string и wstring .

Важно понимать, что вместимость vector’а изменяется динамически. Обычно для увеличения размера используется мультипликативный подход: выделенная под vector память увеличивается при необходимости в константное число раз, т.е. если добавление нового элемента приведет к тому, что размер массива превысит вместимость, то операционной системой для программы будет выделен новый участок памяти, например, в два раза больший, в который будут скопированы все значения из старого участка памяти и к которому будет дописано новое значение.

Алгоритмы

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

  • Методы перебора всех элементов коллекции и их обработки: count , count_if , find , find_if , adjacent_find , for_each , mismatch , equal , search copy , copy_backward , swap , iter_swap , swap_ranges , fill , fill_n , generate , generate_n , replace , replace_if , transform , remove , remove_if , remove_copy , remove_copy_if , unique , unique_copy , reverse , reverse_copy , rotate , rotate_copy , random_shuffle , partition , stable_partition
  • Методы сортировки коллекции: sort , stable_sort , partial_sort , partial_sort_copy , nth_element , binary_search , lower_bound , upper_bound , equal_range , merge , inplace_merge , includes , set_union , set_intersection , set_difference , set_symmetric_difference , make_heap , push_heap , pop_heap , sort_heap , min , max , min_element , max_element , lexographical_compare , next_permutation , prev_permutation
  • Методы выполнения определенных арифметических операций над членами коллекций: Accumulate , inner_product , partial_sum , adjacent_difference

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

Предикаты

Для многих алгоритмов STL можно задать условие, посредством которого алгоритм определит, что ему делать с тем или иным членом коллекции. Предикат — это функция, которая принимает несколько параметров и возвращает логическое значение (истина/ложь). Существует и набор стандартных предикатов.

Потокобезопасность

Важно понимать, что STL — не потокобезопасная библиотека. Но решить эту проблему очень просто: если два потока используют одну коллекцию, просто реализуйте критическую секцию и Mutex .

Заключение

STL — кросс-платформенная библиотека. Конечно, не существует абсолютной гарантии, что эта библиотека есть в любой версии компилятора. Например, она редко реализуется на мобильных устройствах, потому что большая часть реализованных структур данных делает выбор в пользу быстродействия, совершенно не экономя память, а ведь именно память является самым ценным ресурсом на мобильных платформах, в то время как на PC ее сейчас в избытке. Поэтому, нередко вам придется создавать свои реализации STL, например, для переноса вашего приложения на мобильную платформу.

Следите за новыми постами по любимым темам
Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.
Поделиться
Реклама на Tproger: найдем для вас разработчиков нужного стека и уровня.
Курс «Основы программирования на Python»
Старт 3 июля, 2 месяца, онлайн, от 6664 до 19 990 ₽ в месяц

Курс «Django — разработка веб-приложений»
Старт 10 июля, 3 месяца, онлайн, от 6664 до 19 990 ₽ в месяц

Что думаете?

Комментирую от имени компании
Показать все комментарии
Фотография
Обсуждают сейчас
Увеличиваем конверсию в собеседования бесплатно, онлайн, без регистрации
11 минут назад
У вас отличный опыт.

Карьерный путь: из 1C специалиста в Тимлида разработки на Python
5 часов назад

Источник: tproger.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru