В чем разница между STL и STD?
Из часто задаваемых вопросов по стандартной библиотеке GNU C++ (libstdc++): STL (стандартная библиотека шаблонов) послужила источником вдохновения для больших фрагментов стандартной библиотеки C++, но эти термины не взаимозаменяемы и не означают одно и то же.
Что такое STL и STD C++?
STL содержит контейнеры последовательностей и ассоциативные контейнеры. Контейнеры — это объекты, в которых хранятся данные. Стандартные контейнеры последовательностей включают вектор, очередь и список. Стандартными ассоциативными контейнерами являются set, multiset, map, multimap, hash_set, hash_map, hash_multiset и hash_multimap.
Что такое классы STL?
Стандартная библиотека шаблонов (STL) — это набор классов шаблонов C++ для предоставления общих структур данных и функций программирования, таких как списки, стеки, массивы и т. д. Это библиотека классов-контейнеров, алгоритмов и итераторов.
Чем хорош STL?
STL может кардинально изменить ваш стиль программирования, сделав ваш код более пригодным для повторного использования, надежным и надежным. Если вы воспользуетесь преимуществами STL, вы сможете сделать свою жизнь эффективной за счет простоты. STL также расширяем, позволяя добавлять собственные контейнеры и алгоритмы.
Знакомство с STL
Является ли строка С++ STL?
Это действительно часть STL. А std::string — это просто basic_string определение типа Это контейнер, специализированный (не в значении C++ «специализация»). ) для хранения данных со строковой семантикой.
ЭТО ИНТЕРЕСНО: Частый вопрос: Как удалить слои в автокаде?
Когда C++ добавил STL?
STL означает стандартную библиотеку шаблонов. Его изобрел Александр Степанов в 1994 году, а позже он был включен в стандартную библиотеку. Стандартная библиотека состоит из набора алгоритмов и структур данных, которые изначально были частью стандартной библиотеки шаблонов C++.
Что такое STL в Java?
Каркас коллекций: чтобы представить группу объектов как единое целое на языке программирования Java, нам нужны классы и интерфейсы, определенные фреймворком коллекций. Если вы находитесь на фоне C++, вы можете сравнить Collection с контейнерами и Collection Framework с STL (стандартная библиотека шаблонов).
Кто написал С++ STL?
Стандартная библиотека шаблонов (STL) — это программная библиотека, первоначально разработанная Александром Степановым для языка программирования C++, которая повлияла на многие части стандартной библиотеки C++. Он предоставляет четыре компонента, называемые алгоритмами, контейнерами, функциями и итераторами.
Является ли STL фреймворком?
Я полагаю, что «фреймворк» используется здесь как модное слово, хотя фреймворк звучит лучше, чем библиотека, например, с сайта Oracle —… самые известные примеры фреймворков коллекций — это стандартная библиотека шаблонов C++ (STL) и коллекция Smalltalk. иерархии, поэтому даже Oracle считает STL «…
Что представляет из себя язык STL?
Каковы три основных компонента STL?
STL в основном состоит из следующих компонентов, которые упомянуты ниже:
- №1) Контейнеры. Контейнер — это набор объектов определенного типа структуры данных. …
- № 2) Алгоритмы. …
- № 3) Итераторы. …
- #1) Последовательные контейнеры. …
- # 2) Ассоциативные контейнеры. …
- № 3) Пользователи контейнеров.
Что означает std:: в C?
Известно, что «std» (сокращение от стандарта) — это пространство имен, члены которого используются в программе. Таким образом, членами пространства имен «std» являются cout, cin, endl и т. д. Это пространство имен присутствует в iostream. h заголовочный файл.
ЭТО ИНТЕРЕСНО: Как просмотреть CAD в 3D?
Каковы основные компоненты STL?
STL содержит пять видов компонентов: контейнеры, итераторы, алгоритмы, объекты-функции и распределители.
Почему STL так популярен?
Сент-Луис — это оживленный мегаполис в самом сердце США, с его яростно независимыми корнями приграничного города, пронизанными скромностью Среднего Запада. Этот эклектичный город, который обычно называют «Ворота на Запад», славится своей культовой аркой «Ворота», яростно преданными спортивными болельщиками и сценой блюзовой музыки. Испытайте св.
Важен ли С++ STL?
C++ STL предоставляет ряд структур данных, очень полезных в различных сценариях. Многие структуры данных основаны на реальных приложениях. Это библиотека контейнерных классов, алгоритмов и итераторов.
Что такое местоположение STL?
Сент-Луис расположен в восточной части Миссури. Это 15-й по величине город в стране по численности населения и крупнейший городской район в штате Миссури.
.
Факты о городе Сент-Луис.
Cайт | stlouis-mo.gov |
Источник: powerpointmaniac.com
Общие сведения о стандартной библиотеке C++ (STL)
Все сущности библиотеки C++ объявляются или определяются в одном или нескольких стандартных заголовках. Эта реализация включает два других заголовка и , которые не требуются стандарту C++. Полный список заголовков, поддерживаемых этой реализацией, см. в справочнике по файлам заголовков.
Стандарт C++ определяет два типа соответствующих библиотек:
- Размещенная реализация, которая поддерживает все необходимые заголовки стандартной библиотеки, описанные стандартом ISO C++.
- Стандартная реализация, требующая только подмножества заголовков стандартной библиотеки. Необходимое подмножество:
Следующие заголовки являются устаревшими, так как C++11: , и .
Другие различия между автономными и размещенными реализациями:
- Для размещенных реализаций требуется глобальная функция с именем main . Бесплатная реализация может определять собственные функции запуска и завершения.
- Размещенные реализации должны поддерживать несколько потоков, выполняющихся одновременно. Реализации автономных реализаций определяют, поддерживает ли их библиотека параллельные потоки.
Стандартная библиотека Microsoft C++ удовлетворяет требованиям как к автономному, так и к размещению.
Заголовки библиотек C++ имеют два широких подраздела:
- Соглашения iostreams.
- Справочные соглашения по стандартной библиотеке C++ (STL ).
Этот раздел содержит следующие разделы:
- Использование заголовков библиотеки C++
- Соглашения о библиотеках C++
- Соглашения iostreams
- Запуск и завершение программ C++
- Безопасные библиотеки: стандартная библиотека C++
- Проверяемые итераторы
- Поддержка итераторов при отладке
- Справочник по стандартной библиотеке C++ (STL)
- Безопасность потоков в стандартной библиотеке C++
- Пространство имен stdext
- Регулярные выражения (C++)
Дополнительные сведения о библиотеках времени выполнения Visual C++ см. в разделе Функции библиотеки CRT.
Реализация стандартной библиотеки C++ майкрософт часто называется библиотекой STL или стандартной библиотекой шаблонов. Хотя стандартная библиотека C++ — это официальное название библиотеки, как определено в стандарте ISO 14882, из-за популярного использования STL и стандартной библиотеки шаблонов в поисковых системах, иногда используйте эти имена, чтобы упростить поиск нашей документации.
С исторической точки зрения, «STL» первоначально ссылался на стандартную библиотеку шаблонов, написанную Александром Стефановым. Части этой библиотеки были стандартизированы в стандартной библиотеке C++ вместе с библиотекой среды выполнения ISO C, частями библиотеки Boost и другими функциями. Иногда «STL» также используется для ссылки на контейнеры и алгоритмы стандартной библиотеки C++, адаптированной из STL Стефанова. В этой документации стандартная библиотека шаблонов (STL) относится к стандартной библиотеке C++ в целом.
Источник: learn.microsoft.com
Библиотека стандартных шаблонов STL (Standard Template Library). Общие понятия. Контейнеры. Алгоритмы. Итераторы. Функторы
Данная тема является началом изучения библиотеки STL языка C++.
Поиск на других ресурсах:
1. Библиотека STL. Общие сведения
В языке C ++ был разработан мощный набор инструментов для создания разнообразных программ — библиотека стандартных шаблонов (Standard Template Library, STL). Эта библиотека, фактически, является неотъемлемой составляющей языка C++, что является большим достижением ее разработчиков. Библиотека STL включена в стандарт языка C++ и содержит универсальные шаблонные классы и функции, которые реализуют широкий спектр алгоритмов и структур данных. Эти средства программирования можно применять практически к любым типам данных.
Различают следующие основные составляющие (компоненты) библиотеки STL:
- контейнеры (container)
- алгоритмы (algorithm)
- итераторы (iterator)
- функциональные объекты или функторы (functor).
Использование и сочетание этих составляющих позволяет программировать решения очень широкого круга задач программирования.
2. Контейнеры. Общие сведения. Перечень
В программировании контейнер — это объект, который сохраняет другие объекты внутри себя. Объекты, хранящиеся в контейнерах, могут быть как базовых (примитивных) типов так и экземплярами классов с соответствующим необходимым функционалом.
В библиотеке STL реализованы следующие контейнеры:
- bitset — набор битов;
- deque — двухсторонняя очередь;
- list — линейный список;
- map — ассоциативный контейнер, построенный по принципу key : value , в котором каждому ключу key соответствует значение value ;
- multimap — ассоциативный контейнер, в котором одному значению ( key ) соответствует несколько значений ( value1 , value2 , …, valueN );
- multiset — множество, в котором один и тот же элемент может встречаться несколько раз;
- priority_queue — очередь с приоритетами;
- queue — очередь;
- set — множество, в котором каждый элемент встречается только один раз;
- stack — стек;
- vector — динамический массив.
3. Алгоритмы. Общие сведения
Содержимое контейнеров обрабатывается с помощью алгоритмов. Алгоритмы позволяют обрабатывать контейнеры на любой вкус: инициализировать, сортировать содержимое контейнеров, преобразовывать, реализовывать различные виды поиска и тому подобное.
Для доступа к алгоритмам, нужно подключить соответствующую библиотеку
#include algorithm>
Все алгоритмы являются шаблонными функциями. Они могут быть применены к любому типу контейнера. Ниже приведен перечень алгоритмов библиотеки STL:
- adjacent_find — осуществляет поиск пары соседних элементов, которые совпадают между собой;
- binary_search — выполняет бинарный поиск в упорядоченной последовательности;
- copy — копирует одну последовательность в другую;
- copy_backward — делает то же, что и copy , только результирующая последовательность записывается в обратном порядке;
- count — подсчитывает количество вхождений заданного элемента в последовательности;
- count_if — вычисляет количество вхождений элемента в последовательности, соответствующей заданному условию;
- equal — определяет, совпадают ли элементы двух диапазонов;
- equal_range — возвращает диапазон, который допускает вставку элементов без нарушения порядка;
- fill , fill_n — заполняют диапазон нужными значениями;
- find — осуществляет поиск элемента в заданной последовательности, возвращает позицию (итератор) первого вхождения элемента в последовательности;
- find_end — осуществляет поиск последнего вхождения подпоследовательности, содержащийся в заданном диапазоне;
- find_first_of — выполняет поиск первого элемента подпоследовательности, который совпадает с любым элементом другой подпоследовательности;
- find_if — находит первый элемент последовательности, который совпадает с элементом с другой последовательности;
- for_each — применяет указанную функцию к заданному диапазону элементов;
- generate , generate_n — присваивают элементам диапазона значения, возвращаемые функцией-генератором;
- include — определяет, содержит ли одна последовательность другую;
- inplace_merge — объединяет два диапазона;
- iter_swap — осуществляет обмен местами двух значений, на которые указывают аргументы;
- lexicographical_compare — осуществляет лексикографическое сравнение двух последовательностей;
- lower_bound — определяет первый элемент последовательности, который не меньше заданного значения;
- make_heap — на основе заданной последовательности создает «кучу»;
- max — возвращает максимум из двух значений;
- max_element — возвращает позицию (итератор), которая установлена на максимальный элемент последовательности;
- merge — объединяет две упорядоченные последовательности. Результат записывается в третью последовательность;
- min — из двух значений возвращает минимальное;
- min_element — возвращает позицию (итератор), которая установлена на минимальный элемент последовательности;
- mismatch — для двух заданных последовательностей находит первое несовпадение;
- next_permutation — формирует следующую перестановку элементов последовательности;
- nth_element — упорядочивает последовательность таким образом, что все элементы, которые меньше заданного элемента, размещаются перед этим элементом в последовательности;
- partial_sort — выполняет сортировку элементов в заданном диапазоне;
- partial_sort_copy — упорядочивает элементы последовательности в заданном диапазоне, затем копирует в результирующую последовательность отсортированные элементы;
- partition — упорядочивает последовательность так, чтобы все элементы, которые соответствуют заданному условию, размещались перед всеми другими элементами этой последовательности;
- pop_heap — меняет местами первый и предпоследний элементы и перестраивает «кучу»;
- prev_permutation — воспроизводит предыдущую перестановку, состоящую из элементов последовательности;
- push_heap — заталкивает элемент в конец кучи;
- random_shuffle — меняет последовательность в заданном диапазоне;
- remove — удаляет из указанной последовательности элементы, которые имеют определенное значение;
- remove_if — удаляет из указанной последовательности элементы по заданному предикату;
- remove_copy — копирует из указанной последовательности элементы, имеющие определенное значение, в заданную последовательность;
- remove_copy_if — копирует из указанной последовательности элементы в другую область на основе заданного предиката;
- replace — заменяет элементы заданного диапазона из одного значения на другое;
- replace_if — заменяет элементы заданного диапазона на основе предиката;
- replace_copy_if — копирует элементы заданной последовательности в другую область с заменой одного значения на другое;
- replace_copy — копирует элементы заданного диапазона в другую последовательность, заменяя элементы на основе заданного предиката другим значением;
- reverse — изменяет порядок элементов последовательности на противоположный в пределах заданного диапазона;
- reverse_copy — изменяет порядок элементов в последовательности на противоположный и результат записывает в другую последовательность;
- rotate — выполняет циклический сдвиг влево элементов последовательности в заданных пределах;
- rotate_copy — выполняет циклический сдвиг влево элементов последовательности, результат помещает в другую последовательность;
- search — выполняет поиск подпоследовательности в последовательности;
- search_n — находит n-е вхождение заданного элемента в последовательности;
- set_difference — для двух заданных последовательностей создает последовательность, содержащую несовпадающие элементы (разность множеств);
- set_intersection — для двух заданных последовательностей создает последовательность, содержащую совпадающие элементы (пересечение множеств);
- set_symmetric_difference — создает последовательность, которая является симметричной разности двух последовательностей;
- set_union — создает последовательность, которая является объединением двух последовательностей;
- sort — упорядочивает последовательность в заданном диапазоне;
- sort_heap — упорядочивает «кучу» внутри заданного диапазона;
- stable_partition — упорядочивает последовательность в заданных пределах таким образом, чтобы все элементы, которые удовлетворяют заданному условию, предшествовали всем другим элементам. Разбивка последовательности фиксируется;
- stable_sort — упорядочивает последовательность в заданных пределах таким образом, что равные элементы не меняют свои места;
- swap — меняет местами значения, заданные ссылками;
- swap_ranges — меняет местами элементы заданного диапазона;
- transform — для заданной последовательности выполняет функцию к каждому элементу этой последовательности. Результат сохраняется в новой последовательности;
- unique — вытягивает дубликаты из указанной последовательности;
- unique_copy — делает копию из последовательности извлекая из нее дубликаты (одинаковые элементы):
- upper_bound — находит последний элемент последовательности, не превышающий заданное значение.
4. Итераторы. Общие сведения
Итераторы — это объекты, которые позволяют перемещаться по содержимому контейнера. Итераторы подобны указателям. Итераторы являются абстракцией указателя. С помощью итераторов можно считывать и изменять значения элементов контейнера.
Чтобы использовать итераторы нужно подключить заголовок iterator
#include iterator>
В C++ различают 5 видов итераторов:
- RandIter — итератор произвольного доступа — записывает и извлекает значение из контейнера. Обеспечивает произвольный доступ к элементам контейнера;
- BiIter — двунаправленный итератор — записывает и извлекает значения. Перемещается вперед и назад;
- ForIter — прямой итератор — перемещается только вперед. Записывает и извлекает значения;
- InIter — итератор ввода — только извлекает значения. Перемещается только вперед;
- OutIter — итератор вывода — только записывает значения. Перемещается только вперед.
В библиотеке определены следующие классы, реализующие итераторы:
- iterator — базовый класс для всех итераторов;
- iterator_traits — представляет различные типы, определенные итератором;
- insert_iterator — обеспечивает работу итераторов вывода, которые вставляют объекты в контейнеры;
- back_insert_iterator — обеспечивает работу итераторов вывода, которые вставляют объекты в конец контейнера;
- front_insert_iterator — обеспечивает работу итераторов вывода, которые вставляют объекты на начало контейнера;
- reverse_iterator — поддерживает работу обратных итераторов;
- istream_iterator — поддерживает работу потоковых итераторов ввода;
- istreambuf_iterator — поддерживает работу потоковых итераторов ввода символов;
- ostream_iterator — поддерживает работу потоковых итераторов вывода;
- ostreambuf_iterator — поддерживает работу потоковых итераторов вывода символов.
5. Функторы. Общие сведения
Для обеспечения гибкого взаимодействия между итераторами, контейнерами и алгоритмами, используются функторы. Функтор — это класс, в котором реализована операторная функция operator() . Благодаря функторам объект класса представляется как функция.
Чтобы использовать функторы в программе, нужно подключить заголовок functional
#include functional>
В библиотеке STL функторы делятся на две категории:
- бинарные — содержат два аргумента;
- унарные — содержат один аргумент.
Библиотека STL содержит следующие бинарные функторы:
- plus — суммирует ( + ) два аргумента;
- minus — вычитает ( – ) аргументы;
- multplies — умножает ( * ) два аргумента;
- divides — делит ( / ) аргументы;
- modulus — возвращает результат операции % для двух аргументов;
- equal_to — сравнивает два аргументы на равенство ( == );
- not_equal_to — сравнивает два аргументы на неравенство ( != );
- greater — определяет, больше ли первый аргумент чем второй аргумент ( > );
- greater_equal — определяет, первый аргумент есть больше или равен второму аргументу ( >= );
- less — определяет, меньше ли первый аргумент чем второй аргумент ( );
- less_equal — определяет, первый аргумент меньше или равен второму аргументу ( );
- logical_and — применяет к аргументам логическое «И» (AND);
- logical_or — применяет к двум аргументам логическое «ИЛИ» (OR).
Также определены два унарных функтора:
- logical_not — применяет к аргументу логическое «НЕТ» (NOT);
- negate — изменяет знак своего аргумента на противоположный.
Связанные темы
Источник: www.bestprog.net
STL: стандартная библиотека шаблонов С++
Механизм шаблонов встроен в компилятор C++, чтобы дать возможность программистам делать свой код короче за счет обобщенного программирования. Естественно, существуют и стандартные библиотеки, реализующие этот механизм. STL является самой эффективной библиотекой C++ на сегодняшний день.
Сейчас существует немало ее реализаций, каждая из которых, хоть и создана в рамках стандарта, обладает собственными расширениями. У подобного подхода есть один недостаток: не всегда код будет работать одинаково с разными компиляторами. Поэтому настоятельно рекомендуем вам максимально придерживаться традиционных приемов, как бы хорошо вы не разбирались в конкретной реализации библиотеки.
Первое знакомство
Для начала рассмотрим самые популярные коллекции из библиотеки. Каждая из них имеет собственный набор шаблонных параметров, чтобы быть максимально удобной для как можно большего спектра решаемых задач.
Коллекции
Для использования коллекции в своем коде используйте следующую директиву:
#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)
Важно понимать, что при получении итератора на какой-то элемент коллекции и последующем изменении коллекции итератор может стать непригоден для использования.
Итерация вперед и аналогично назад происходит так:
for (iterator element = begin (); element
При использовании random access iterator, например, так:
for (iterator element = begin (); element
Методы коллекций
Основными методами, присутствующими почти во всех коллекциях являются следующие:
- empty — определяет, пуста ли коллекция;
- size — возвращает размер коллекции;
- begin — возвращает прямой итератор, указывающий на начало коллекции;
- end — возвращает прямой итератор, указывающий на конец коллекции, т.е. на несуществующий элемент, идущий после последнего;
- rbegin — возвращает обратный итератор на начало коллекции;
- rend — возвращает обратный итератор на конец коллекции;
- clear — очищает коллекцию, т.е. удаляет все ее элементы;
- erase — удаляет определенные элементы из коллекции;
- capacity — возвращает вместимость коллекции, т.е. количество элементов, которое может вместить эта коллекция (фактически, сколько памяти под коллекцию выделено);
Вместимость коллекции, как было сказано в начале, меняется по мере надобности, т.е. если вся выделенная под коллекцию память уже заполнена, то при добавлении нового элемента вместимость коллекции будет увеличена, а все значения, бывшие в ней до увеличения, будут скопированы в новую область памяти — это довольно «дорогая» операция. Убедиться в том, что размер и вместимость — разные вещи, можно на следующем примере:
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.ru
21.4 – Обзор алгоритмов 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
Этот дает следующий результат:
-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