![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Wowa |
|
||||||||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Содержание:
- Что такое STL и с чем его едят ? - Каковы основные понятия STL ? С чего начинать ? - Как организовать динамический массив ? - Как организовать список значений ? - Как удалить элемент из массива или списка ? - Как вставить элемент в середину списка или массива ? - Как хранить объекты в списке / динамическом массиве - Как организовать список списков, массив списков и т.п. ? ==================================================== - Что такое STL и с чем его едят ? Standard Templates Library, библиотека стандартных шаблонов, это часть стандарта C++, впервые предложена Hewlett-Packard Company, на данный момент для С++ не существует более быстрого, удобного и простого решения по организации хранения данных в виде списков, динамических массивов, карт (ассоциативных списков), стека и др. STL- кроссплатформенный продукт, его можно использовать в приложениях под WinAPI, Linux, и Mac. - Каковы основные понятия STL ? С чего начинать ? Предполагается знание основ C++, и владение понятием "шаблон" (template). Далее, из пяти предлагаемых в различной литературе понятий на начальном этапе достаточно знать всего три: контейнер - шаблон класса, служащий для хранения данных. Простыми словами: контейнер нужен нам как "обёртка" вокруг наших данных, чтобы хранить их, например, в списке. Такой список можно организовать из чисел float, из строк string, из объектов созданного нами класса, и т.д. итератор - специальный тип, служащий аналогом Си-шного указателя, используется для прохода по списку, массиву, поиска элемента в ассоциативном списке, и т.д. Это настоящий аналог указателя, к нему можно применять операции ++ и -- , "звездочку" или -> для получения значения. Операция ++ сдвигает итератор к следующему элементу динамического массива, списка, очереди и т.п. Можно сравнивать два итератора. Вместо NULL, признаком выхода за пределы допустимых значений служит специальный итератор, получаемый из контейнера с помощью функции end() (об этом позже). алгоритм - шаблон функции, выполняющей конкретную задачу (поиск, сортировка и т.д.) над любыми контейнерами. Функция-алгоритм принимает в качестве параметров итераторы или указатели. - Как организовать динамический массив ? Динамический массив в STL называется "vector". Простой пример:
Пояснения: - в треугольных скобках указывается тип значений, хранимых в vector-е - чтобы память не выделялась повторно каждый раз, когда динамический массив изменяет размер (растёт или уменьшается), есть специальная функция arr.reserve(N), заранее резервирующая память под N элементов. Того же результата можно добиться при создании vector-а: vector < float> arr(N), где N - произвольная переменная или константа. - Как организовать список значений ?
Пояснения: - создание списка и добавление элементов - по аналогии с vector-ом - функции resize(), push_front(), clear(), begin() и другие - имеются в каждом контейнере (в vector-е в том числе). - copy(A, B, C) - алгоритм, копирующий все элементы из контейнера или массива, на который указывает итератор или указатель C, в контейнер или массив, на который указывают итераторы или указатели A и B, причём A указывает на первый элемент, B указывает на элемент, находящийся после последнего элемента массива или контейнера. Для любого контейнера, В можно получить с помощью функции end(), для массива - можно прибавить размер массива к указателю на первый элемент (например, values + 3). - итератор ("псевдоуказатель") для каждого контейнера, создаваемого нами, имеет свой отличный тип. Для того, чтобы объявить итератор i из контейнера list< float>, используется выражение list< float> ::iterator i. Такие, подчас "сложные", выражения, лучше заменять на typedef-ы:
- как уже говорилось, для получения значения, на которое указывает итератор итератор, используется звёздочка: *i. Для перемещения по списку мы просто сдвигаем итератор операцией ++. - Как удалить элемент из массива или списка ? Для того, чтобы удалить элемент из "головы" или "хвоста" - используется пара функций pop_front(), pop_back(). Для удаления произвольного элемента используется функция erase(i), где i - это итератор, указывающий на элемент. - Как вставить элемент в середину списка или массива ? Используя функцию insert(i, v), где v - это вставляемое значение, i - итератор, указывающий на элемент, перед которым нужно вставить значение. - Как хранить объекты в списке / динамическом массиве Точно так же, как обычные float-ы:
- Как организовать список списков, массив массивов и т.п. ? В любом контейнере можно хранить вложенный контейнер. Для простоты записи, можно использовать typedef-ы:
|
||||||||||
|
|||||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |