Слайд 1Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
ЯЗЫКИ ПРОГРАММИРОВАНИЯ
Стандартная библиотека шаблонов
Слайд 2Итераторы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Для доступа к элементам
некоторого множества элементов алгоритмы stl используют специальные объекты, называемые итераторами.
Итератор — объект, позволяющий программисту перебирать все элементы коллекции без учёта особенностей её реализации. Предназначен итератор исключительно для доступа к элементам.
Слайд 3Итераторы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Категории итераторов
итератор ввода (input
iterator) - используется потоками ввода;
итератор вывода (output iterator) - используется потоками вывода;
однонаправленный итератор (forward iterator) - для прохода по элементам в одном направлении;
Слайд 4Итераторы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Категории итераторов
двунаправленный итератор (bidirectional
iterator) - способен пройтись по элементам в любом направлении. Такие итераторы реализованы в некоторых контейнерных типах stl (list, set, multiset, map, multimap);
итераторы произвольного доступа (random access) - через них можно иметь доступ к любому элемента. Такие итераторы реализованы в некоторых контейнерных типах stl (vector, deque, string, array).
Слайд 5Итераторы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Слайд 6Итераторы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Кроме операций для итераторов
определены три функции:
advance (InIt& pos, dist n) - перемещает итератор на указанную дистанцию;
dist distance (InIt pos1, InIt pos2) - вычисляет дистанцию между двумя итераторами;
iter_swap (FIt1 pos1, FIt2 pos2) - обменивает значения указанных итераторов.
Слайд 7Контейнеры
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Многие вычисления подразумевают создание
наборов объектов в различных формах и обработку таких наборов.
Класс, главной целью которого является хранение объектов, называется контейнером.
Реализация контейнеров, подходящих для данной задачи, и поддержка их основными полезными операциями — важнейшие шаги при написании любой программы.
Слайд 8Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Встроенные массивы имеют фиксированный
размер.
Если мы выберем слишком большой размер, то впустую израсходуем память.
Если же выбранный размер слишком мал, массив может переполниться.
В любом случае нам придется написать код низкого уровня для управления памятью.
Стандартная библиотека предоставляет вектора (vector), которые сами позаботятся об этом
Слайд 9Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Если мы хотим использовать
векторы в своей программе, необходимо подключить заголовочный файл :
#include
Вектор можно объявить следующим образом:
std::vector myVector(10);
std::vector v2(10,2);
std::vector v1;
Слайд 10Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Итераторы
begin() - итератор на первый
элемент;
end() - итератор на элемент идущий после последнего;
rbegin() - итератор на последний элемент (для обратных алгоритмов);
rend() - итератор на позицию перед первым элементом (для обратных алгоритмов).
Слайд 11Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::vector first; // empty vector of ints
std::vector second(4, 100); // four ints with value 100
std::vector third(second.begin(), second.end()); // iterating through second
std::vector fourth(third); // a copy of third
// the iterator constructor can also be used to construct from arrays:
int myints[] = { 16,2,77,29 };
std::vector fifth(myints, myints + sizeof(myints) / sizeof(int));
std::cout << "The contents of fourth are:";
for (std::vector::iterator it = fourth.begin(); it != fourth.end(); ++it)
std::cout << ' ' << *it;
std::cout << std::endl;
std::cout << "The contents of fifth are:";
for (std::vector::iterator it = fifth.begin(); it != fifth.end(); ++it)
std::cout << ' ' << *it;
std::cout << std::endl;
return 0;
}
Слайд 12Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main()
{
std::vector myvector(5); // 5 default-constructed ints
for (int i = 0; i < myvector.size(); ++i)
myvector[i] = i;
std::cout << "myvector contains:";
std::vector::reverse_iterator rit = myvector.rbegin();
for (; rit != myvector.rend(); ++rit)
std::cout << ' ' << *rit;
std::cout << std::endl;
return 0;
}
Слайд 13Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
назначение элементов
assign(InputIterator first, InputIterator
last) - удалить все элементы и вставить элементы из диапазона [first, last);
assign(size_type, const T& t) - удалить все элементы и вставить n элементов со значением t;
swap(vector& x) - обменять значения элементов векторов
Слайд 14Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::vector first, second, third;
first.assign(7,0);
for (int i = 0; i < first.size(); i++)
first[i] = i;
std::vector::iterator it;
it = first.begin() + 1;
second.assign(it, first.end() - 1);
int myints[] = { 1776,7,4 };
third.assign(myints, myints + 3); // assigning from array.
std::cout << "first vector: ";
std::cout << "Size of first: " << int(first.size()) << std::endl;
for (int i = 0; i < first.size(); i++)
std::cout << first[i] << " ";
std::cout << std::endl;
// вывод остальных массивов
return 0;
}
Слайд 15Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::vector foo(3, 100); // three ints with a value of 100
std::vector bar(5, 200); // five ints with a value of 200
foo.swap(bar);
std::cout << "foo contains:";
for (unsigned i = 0; i std::cout << ' ' << foo[i];
std::cout << std::endl;
std::cout << "bar contains:";
for (unsigned i = 0; i std::cout << ' ' << bar[i];
std::cout << std::endl;
return 0;
}
Слайд 16Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
доступ к элементам
at(size_type n) -
доступ к элементу с индексом n, при некорректном значении n возбуждается исключение;
back() - доступ к последнему элементу;
front() - доступ к первому элементу.
Если исключение не нужно, то для доступа к элементам можно воспользоваться перегруженной операцией [].
Слайд 17Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::vector myvector(10);
for (unsigned i = 0; i myvector.at(i) = i;
std::cout << "myvector contains:";
for (unsigned i = 0; i std::cout << ' ' << myvector.at(i);
std::cout << std::endl;
return 0;
}
Слайд 18Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
поддержка стека
pop_back() - удалить
последний элемент;
push_back(const T& x) - добавить в конец элемент.
Слайд 19Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::vector myvector;
int sum(0);
myvector.push_back(100);
myvector.push_back(200);
myvector.push_back(300);
while (!myvector.empty())
{
sum += myvector.back();
myvector.pop_back();
}
std::cout << "The elements of myvector add up to " << sum << '\n';
return 0;
}
Слайд 20Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
удаление элементов
clear() - удалить
все элементы из вектора;
erase(iterator position) - удаляет указанный элемент и возвращает итератор на следующий элемент или end();
erase(iterator first, iterator last) - удаляет элементы из диапазона [first, last).
Слайд 21Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main() {
std::vector myvector;
myvector.push_back(100);
myvector.push_back(200);
myvector.push_back(300);
std::cout << "myvector contains:";
for (unsigned i = 0; i std::cout << ' ' << myvector[i];
std::cout << std::endl;
myvector.clear();
std::cout << "myvector size " << myvector.size() << std::endl;
myvector.push_back(1101);
myvector.push_back(2202);
std::cout << "myvector contains:";
for (unsigned i = 0; i std::cout << ' ' << myvector[i];
std::cout << std::endl;
return 0;
}
Слайд 22Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::vector myvector;
for (int i = 1; i <= 10; i++) myvector.push_back(i);
// erase the 6th element
myvector.erase(myvector.begin() + 5);
// erase the first 3 elements:
myvector.erase(myvector.begin(), myvector.begin() + 3);
std::cout << "myvector contains:";
for (unsigned i = 0; i std::cout << ' ' << myvector[i];
std::cout << std::endl;
return 0;
}
Слайд 23Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
вставка элементов
insert(iterator position, size_type
n, const T& x) - вставляет n элементов со значением x в указанную позицию;
insert(iterator position, const T& x) - вставляет элемент со значением x в указанную позицию;
insert(iterator position, InputIterator first, InputIterator last) - вставляет в указанную позицию копии элементов диапазона [first, last).
Слайд 24Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
void print_vector(std::vector& vec1){
for (int i = 0; i < vec1.size();i++)
std::cout << " " << vec1[i];
std::cout << std::endl;
}
int main(){
std::vector myvector(3, 100);
std::vector::iterator it;
it = myvector.begin();
it = myvector.insert(it, 200);
std::cout << "myvector first ";
print_vector(myvector);
myvector.insert(it, 2, 300);
std::cout << "myvector second";
print_vector(myvector);
it = myvector.begin();
Слайд 25Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
std::vector
anothervector(3, 400);
myvector.insert(it + 2, anothervector.begin(), anothervector.end());
std::cout << "myvector third";
print_vector(myvector);
int myarray[] = { 501,502,503 };
myvector.insert(myvector.begin(), myarray, myarray + 3);
std::cout << "myvector contains:";
print_vector(myvector);
return 0;
}
Слайд 26Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
перегруженные операции
[] - операция
индексации, не генерирует исключение при выходе за границы массива;
= - назначить одному вектору копии элементов второго (v1 = v2);
== - определить равны ли два вектора (v1 == v2);!= - определить не равны ли два вектора (v1 != v2);
Слайд 27Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
перегруженные операции
< - меньше
ли один вектор чем другой (v1 < v2);
> - больше ли один вектор чем другой (v1 > v2);
<= - меньше или равен один вектор по отношению к другому (v1 <= v2);
>= - больше или равен один вектор по отношению к другому (v1 >= v2).
Слайд 28Двусвязные списки в C++
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Чтобы
воспользоваться контейнером списков в С++, вам необходимо подключить следующий заголовочный файл:
#include
Конструкторы
list(const allocator_type& alloc = allocator_type()); // default
list(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()); //fill
template list(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()); //range
list(const list& x); //copy
Слайд 29списки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Итераторы
begin() - итератор на первый
элемент;
end() - итератор на элемент идущий после последнего;
rbegin() - итератор на последний элемент (для обратных алгоритмов);
rend() - итератор на позицию перед первым элементом (для обратных алгоритмов).
Слайд 30списки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::list first;
std::list second(4, 100);
std::list third(second.begin(), second.end());
std::list fourth(third);
int myints[] = { 16,2,77,29 };
std::list fifth(myints, myints + sizeof(myints) / sizeof(int));
std::cout << "The contents of fifth are: ";
for (std::list::iterator it = fifth.begin(); it != fifth.end(); it++)
std::cout << *it << ' ';
std::cout << std::endl;
return 0;
}
Слайд 31Вектор
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Размерность
empty Проверяет, пуст ли список.
size Возвращает
количество элементов в списке.
max_size Возвращает максимальную длину списка.
Слайд 32Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
Доступ к элементам:
front - возвращает
ссылку на первый элемент в списке.
back - возвращает ссылку на последний элемент в списке.
Изменение списка:
push_back - добавляет элемент в конец списка.
push_front - добавляет элемент в начало списка
pop_back - удаляет элемент в конце списка.
pop_front - удаляет элемент в начале списка.
Слайд 33Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А. Овчинникова
#include
#include
int main(){
std::list mylist;
mylist.push_back(77);
mylist.push_back(22);
mylist.front() -= mylist.back();
std::cout << "mylist.front() is now " << mylist.front() << '\n';
return 0;
}